/*
 * Copyright (c) 2018 Tencent. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
const AbstractModel = require("../../common/abstract_model");

/**
 * ModifyCompareTask response structure.
 * @class
 */
class ModifyCompareTaskResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeSyncJobs response structure.
 * @class
 */
class DescribeSyncJobsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of tasks
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Array of task details
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SyncJobInfo> || null}
         */
        this.JobList = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.JobList) {
            this.JobList = new Array();
            for (let z in params.JobList) {
                let obj = new SyncJobInfo();
                obj.deserialize(params.JobList[z]);
                this.JobList.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyMigrationJob response structure.
 * @class
 */
class ModifyMigrationJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ResetConsumerGroupOffset response structure.
 * @class
 */
class ResetConsumerGroupOffsetResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyMigrateRateLimit response structure.
 * @class
 */
class ModifyMigrateRateLimitResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * IsolateMigrateJob response structure.
 * @class
 */
class IsolateMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyMigrateJobSpec request structure.
 * @class
 */
class ModifyMigrateJobSpecRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * New instance specification. Valid values: `micro`, `small`, `medium`, `large`, `xlarge`, `2xlarge`.
         * @type {string || null}
         */
        this.NewInstanceClass = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.NewInstanceClass = 'NewInstanceClass' in params ? params.NewInstanceClass : null;

    }
}

/**
 * IsolateSubscribe response structure.
 * @class
 */
class IsolateSubscribeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyConsumerGroupPassword request structure.
 * @class
 */
class ModifyConsumerGroupPasswordRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Account name. The full name of the actual account is in the form: account-#{SubscribeId}-#{AccountName}.
         * @type {string || null}
         */
        this.AccountName = null;

        /**
         * Consumer group name. The full name of the actual consumer group is in the form: consumer-grp-#{SubscribeId}-#{ConsumerGroupName}.
         * @type {string || null}
         */
        this.ConsumerGroupName = null;

        /**
         * Old Password.
         * @type {string || null}
         */
        this.OldPassword = null;

        /**
         * New password. The character length is no less than 3 and no more than 32.
         * @type {string || null}
         */
        this.NewPassword = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.AccountName = 'AccountName' in params ? params.AccountName : null;
        this.ConsumerGroupName = 'ConsumerGroupName' in params ? params.ConsumerGroupName : null;
        this.OldPassword = 'OldPassword' in params ? params.OldPassword : null;
        this.NewPassword = 'NewPassword' in params ? params.NewPassword : null;

    }
}

/**
 * Error or warning information in the current step
 * @class
 */
class StepTip extends  AbstractModel {
    constructor(){
        super();

        /**
         * Error code
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Code = null;

        /**
         * Error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Solution
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Solution = null;

        /**
         * Help document
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.HelpDoc = null;

        /**
         * Whether the current step is skipped
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SkipInfo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Code = 'Code' in params ? params.Code : null;
        this.Message = 'Message' in params ? params.Message : null;
        this.Solution = 'Solution' in params ? params.Solution : null;
        this.HelpDoc = 'HelpDoc' in params ? params.HelpDoc : null;
        this.SkipInfo = 'SkipInfo' in params ? params.SkipInfo : null;

    }
}

/**
 * ModifySyncRateLimit response structure.
 * @class
 */
class ModifySyncRateLimitResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DestroyMigrateJob request structure.
 * @class
 */
class DestroyMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * ModifySubscribeName request structure.
 * @class
 */
class ModifySubscribeNameRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Modified data subscription instance name. Value range: 1-60.
         * @type {string || null}
         */
        this.SubscribeName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.SubscribeName = 'SubscribeName' in params ? params.SubscribeName : null;

    }
}

/**
 * Checkpoint information in Kafka partition for data subscription.
 * @class
 */
class OffsetTimeMap extends  AbstractModel {
    constructor(){
        super();

        /**
         * Kafka partition numberNote: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.PartitionNo = null;

        /**
         * Kafka offsetNote: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Offset = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.PartitionNo = 'PartitionNo' in params ? params.PartitionNo : null;
        this.Offset = 'Offset' in params ? params.Offset : null;

    }
}

/**
 * SkipCheckItem response structure.
 * @class
 */
class SkipCheckItemResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Message prompted for skipping the check item
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Message = 'Message' in params ? params.Message : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ResumeSyncJob request structure.
 * @class
 */
class ResumeSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * The partition allocation of Kafka consumer groups in data subscriptions. This data is queried in real time. If you need the latest data, you need to call the interface again.
 * @class
 */
class PartitionAssignment extends  AbstractModel {
    constructor(){
        super();

        /**
         * The clientId of the consumer
         * @type {string || null}
         */
        this.ClientId = null;

        /**
         * The partition is being consumed by this consumer.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<number> || null}
         */
        this.PartitionNo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ClientId = 'ClientId' in params ? params.ClientId : null;
        this.PartitionNo = 'PartitionNo' in params ? params.PartitionNo : null;

    }
}

/**
 * ResizeSyncJob response structure.
 * @class
 */
class ResizeSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateSubscribeCheckJob request structure.
 * @class
 */
class CreateSubscribeCheckJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * ResumeMigrateJob response structure.
 * @class
 */
class ResumeMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Details of inconsistent tables
 * @class
 */
class DifferenceItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Database name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Db = null;

        /**
         * Table name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Table = null;

        /**
         * Chunk ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Chunk = null;

        /**
         * Source database value
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SrcItem = null;

        /**
         * Target database value
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DstItem = null;

        /**
         * Index name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.IndexName = null;

        /**
         * First index key
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.LowerBoundary = null;

        /**
         * Last index key
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UpperBoundary = null;

        /**
         * Comparison time in ms
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CostTime = null;

        /**
         * Completion time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FinishedAt = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Db = 'Db' in params ? params.Db : null;
        this.Table = 'Table' in params ? params.Table : null;
        this.Chunk = 'Chunk' in params ? params.Chunk : null;
        this.SrcItem = 'SrcItem' in params ? params.SrcItem : null;
        this.DstItem = 'DstItem' in params ? params.DstItem : null;
        this.IndexName = 'IndexName' in params ? params.IndexName : null;
        this.LowerBoundary = 'LowerBoundary' in params ? params.LowerBoundary : null;
        this.UpperBoundary = 'UpperBoundary' in params ? params.UpperBoundary : null;
        this.CostTime = 'CostTime' in params ? params.CostTime : null;
        this.FinishedAt = 'FinishedAt' in params ? params.FinishedAt : null;

    }
}

/**
 * CreateModifyCheckSyncJob request structure.
 * @class
 */
class CreateModifyCheckSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * IsolateSyncJob request structure.
 * @class
 */
class IsolateSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * PauseMigrateJob request structure.
 * @class
 */
class PauseMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * ContinueMigrateJob request structure.
 * @class
 */
class ContinueMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * ResetConsumerGroupOffset request structure.
 * @class
 */
class ResetConsumerGroupOffsetRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Subscribed Kafka topic
         * @type {string || null}
         */
        this.TopicName = null;

        /**
         * Consumer group name. The full name of the actual consumer group is in the form: consumer-grp-#{SubscribeId}-#{ConsumerGroupName}.
         * @type {string || null}
         */
        this.ConsumerGroupName = null;

        /**
         * The partition number of offset needs to be modified.
         * @type {Array.<number> || null}
         */
        this.PartitionNos = null;

        /**
         * Reset mode. Valid values: earliest (start consumption from the earliest position); latest (start consumption from the latest position); datetime (start consumption from the most recent checkpoint before the specified time).
         * @type {string || null}
         */
        this.ResetMode = null;

        /**
         * When ResetMode is datetime, this field needs to be filled in, the format is: Y-m-d h:m:s. If not filled in, the default time is 0, and the effect is the same as earliest.
         * @type {string || null}
         */
        this.ResetDatetime = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.TopicName = 'TopicName' in params ? params.TopicName : null;
        this.ConsumerGroupName = 'ConsumerGroupName' in params ? params.ConsumerGroupName : null;
        this.PartitionNos = 'PartitionNos' in params ? params.PartitionNos : null;
        this.ResetMode = 'ResetMode' in params ? params.ResetMode : null;
        this.ResetDatetime = 'ResetDatetime' in params ? params.ResetDatetime : null;

    }
}

/**
 * ModifySyncRateLimit request structure.
 * @class
 */
class ModifySyncRateLimitRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Number of full export threads for sync task. Value range: 1-16.
         * @type {number || null}
         */
        this.DumpThread = null;

        /**
         * The full export Rps for sync task. The value needs to be greater than 0.
         * @type {number || null}
         */
        this.DumpRps = null;

        /**
         * Number of full import threads for sync task. Value range: 1-16.
         * @type {number || null}
         */
        this.LoadThread = null;

        /**
         * Number of incremental import threads for sync task. Value range: 1-128.
         * @type {number || null}
         */
        this.SinkerThread = null;

        /**
         * The full import Rps for sync task.
         * @type {number || null}
         */
        this.LoadRps = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.DumpThread = 'DumpThread' in params ? params.DumpThread : null;
        this.DumpRps = 'DumpRps' in params ? params.DumpRps : null;
        this.LoadThread = 'LoadThread' in params ? params.LoadThread : null;
        this.SinkerThread = 'SinkerThread' in params ? params.SinkerThread : null;
        this.LoadRps = 'LoadRps' in params ? params.LoadRps : null;

    }
}

/**
 * DescribeCheckSyncJobResult request structure.
 * @class
 */
class DescribeCheckSyncJobResultRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task instance ID in the format of `sync-werwfs23`, which is used to identify a sync task. This parameter is required.
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * ModifySubscribeAutoRenewFlag response structure.
 * @class
 */
class ModifySubscribeAutoRenewFlagResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DestroySyncJob response structure.
 * @class
 */
class DestroySyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Task error information
 * @class
 */
class ErrorInfoItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Error code
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Code = null;

        /**
         * Solution
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Solution = null;

        /**
         * Error log
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ErrorLog = null;

        /**
         * Help document
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.HelpDoc = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Code = 'Code' in params ? params.Code : null;
        this.Solution = 'Solution' in params ? params.Solution : null;
        this.ErrorLog = 'ErrorLog' in params ? params.ErrorLog : null;
        this.HelpDoc = 'HelpDoc' in params ? params.HelpDoc : null;

    }
}

/**
 * IsolateMigrateJob request structure.
 * @class
 */
class IsolateMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * StopMigrateJob response structure.
 * @class
 */
class StopMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * The set of table objects, which is required if `TableMode` is `partial`.
 * @class
 */
class TableItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Name of the migrated table, which is case-sensitive
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableName = null;

        /**
         * New name of the migrated table. This parameter is required when `TableEditMode` is `rename`. It is mutually exclusive with `TmpTables`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewTableName = null;

        /**
         * The temp tables to be migrated. This parameter is mutually exclusive with `NewTableName`. It is valid only when the configured migration objects are table-level ones and `TableEditMode` is `pt`. To migrate temp tables generated when pt-osc or other tools are used during the migration process, you must configure this parameter first. For example, if you want to perform the pt-osc operation on a table named "t1", configure this parameter as ["_t1_new","_t1_old"]; to perform the gh-ost operation on t1, configure it as ["_t1_ghc","_t1_gho","_t1_del"]. Temp tables generated by pt-osc and gh-ost operations can be configured at the same time.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.TmpTables = null;

        /**
         * Table editing type. Valid values: `rename` (table mapping); `pt` (additional table sync).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableEditMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TableName = 'TableName' in params ? params.TableName : null;
        this.NewTableName = 'NewTableName' in params ? params.NewTableName : null;
        this.TmpTables = 'TmpTables' in params ? params.TmpTables : null;
        this.TableEditMode = 'TableEditMode' in params ? params.TableEditMode : null;

    }
}

/**
 * Subscription instance information
 * @class
 */
class SubscribeInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Data subscription instance name
         * @type {string || null}
         */
        this.SubscribeName = null;

        /**
         * Kafka topic for data sent by the subscription instance
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Topic = null;

        /**
         * Subscription instance type. Currently, cynosdbmysql, mariadb, mongodb, mysql, percona, tdpg, tdsqlpercona are supported.
         * @type {string || null}
         */
        this.Product = null;

        /**
         * The subscribed database instance ID (if the subscription is a cloud database). If the instance is not on Tencent Cloud, this value is empty.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * Cloud database status: running, isolated, offline. If it is not on the cloud, this value is empty.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceStatus = null;

        /**
         * Data subscription lifecycle status. Valid values: normal (normal), isolating (isolating), isolated (isolated), offlining (offlining), post2PrePayIng (changing from pay-as-you-go to monthly subscription).
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Data subscription status. Valid values: notStarted, checking, checkNotPass, checkPass, starting, running, error.
         * @type {string || null}
         */
        this.SubsStatus = null;

        /**
         * Last modification time, the format is: Y-m-d h:m:s.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ModifyTime = null;

        /**
         * Creation time, the format is: Y-m-d h:m:s.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CreateTime = null;

        /**
         * Isolation time, the format is: Y-m-d h:m:s. Default time: 0000-00-00 00:00:00.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.IsolateTime = null;

        /**
         * Expiration time for monthly subscription tasks, the format is: Y-m-d h:m:s. Default time: 0000-00-00 00:00:00.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpireTime = null;

        /**
         * Offline time, the format is: Y-m-d h:m:s. Default time: 0000-00-00 00:00:00.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.OfflineTime = null;

        /**
         * Billing mode. 1: pay-as-you-go
         * @type {number || null}
         */
        this.PayType = null;

        /**
         * Auto-renewal flag. It is meaningful only when PayType=0. Valid values: 0 (auto-renewal disabled); 1 (auto-renewal enabled).
         * @type {number || null}
         */
        this.AutoRenewFlag = null;

        /**
         * Data subscription instance region
         * @type {string || null}
         */
        this.Region = null;

        /**
         * Access type. Valid values: extranet (public network); vpncloud (VPN access); dcg (Direct Connect); ccn (CCN); cdb (database); cvm (self-build on CVM); intranet (intranet); vpc (VPC).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Database node information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<EndpointItem> || null}
         */
        this.Endpoints = null;

        /**
         * Data subscription version, only Kafka version is currently supported.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SubscribeVersion = null;

        /**
         * TagNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Task error messageNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SubsErr> || null}
         */
        this.Errors = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.SubscribeName = 'SubscribeName' in params ? params.SubscribeName : null;
        this.Topic = 'Topic' in params ? params.Topic : null;
        this.Product = 'Product' in params ? params.Product : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.InstanceStatus = 'InstanceStatus' in params ? params.InstanceStatus : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.SubsStatus = 'SubsStatus' in params ? params.SubsStatus : null;
        this.ModifyTime = 'ModifyTime' in params ? params.ModifyTime : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.IsolateTime = 'IsolateTime' in params ? params.IsolateTime : null;
        this.ExpireTime = 'ExpireTime' in params ? params.ExpireTime : null;
        this.OfflineTime = 'OfflineTime' in params ? params.OfflineTime : null;
        this.PayType = 'PayType' in params ? params.PayType : null;
        this.AutoRenewFlag = 'AutoRenewFlag' in params ? params.AutoRenewFlag : null;
        this.Region = 'Region' in params ? params.Region : null;
        this.AccessType = 'AccessType' in params ? params.AccessType : null;

        if (params.Endpoints) {
            this.Endpoints = new Array();
            for (let z in params.Endpoints) {
                let obj = new EndpointItem();
                obj.deserialize(params.Endpoints[z]);
                this.Endpoints.push(obj);
            }
        }
        this.SubscribeVersion = 'SubscribeVersion' in params ? params.SubscribeVersion : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

        if (params.Errors) {
            this.Errors = new Array();
            for (let z in params.Errors) {
                let obj = new SubsErr();
                obj.deserialize(params.Errors[z]);
                this.Errors.push(obj);
            }
        }

    }
}

/**
 * ModifyCompareTaskName request structure.
 * @class
 */
class ModifyCompareTaskNameRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task ID in the format of `dts-8yv4w2i1-cmp-37skmii9`
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * Data consistency check task name
         * @type {string || null}
         */
        this.TaskName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.TaskName = 'TaskName' in params ? params.TaskName : null;

    }
}

/**
 * CompleteMigrateJob response structure.
 * @class
 */
class CompleteMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeMigrateDBInstances response structure.
 * @class
 */
class DescribeMigrateDBInstancesResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of eligible items
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Instance list
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<MigrateDBItem> || null}
         */
        this.Instances = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.Instances) {
            this.Instances = new Array();
            for (let z in params.Instances) {
                let obj = new MigrateDBItem();
                obj.deserialize(params.Instances[z]);
                this.Instances.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Additional configuration information
 * @class
 */
class KeyValuePairOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * Option key
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Key = null;

        /**
         * Option value
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Value = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Key = 'Key' in params ? params.Key : null;
        this.Value = 'Value' in params ? params.Value : null;

    }
}

/**
 * CreateCheckSyncJob request structure.
 * @class
 */
class CreateCheckSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * DescribeModifyCheckSyncJobResult response structure.
 * @class
 */
class DescribeModifyCheckSyncJobResultResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Execution status of the check task Valid values: `notStarted` (Not started), `running` (Running), `failed` (Failed), `success` (Successful).
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Number of check steps Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepCount = null;

        /**
         * Current step Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepCur = null;

        /**
         * Overall progress. Value range: 0-100. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Progress = null;

        /**
         * Step details Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepInfo> || null}
         */
        this.StepInfos = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Status = 'Status' in params ? params.Status : null;
        this.StepCount = 'StepCount' in params ? params.StepCount : null;
        this.StepCur = 'StepCur' in params ? params.StepCur : null;
        this.Progress = 'Progress' in params ? params.Progress : null;

        if (params.StepInfos) {
            this.StepInfos = new Array();
            for (let z in params.StepInfos) {
                let obj = new StepInfo();
                obj.deserialize(params.StepInfos[z]);
                this.StepInfos.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * StartSubscribe response structure.
 * @class
 */
class StartSubscribeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeSubscribeReturnable request structure.
 * @class
 */
class DescribeSubscribeReturnableRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * DescribeMigrationDetail request structure.
 * @class
 */
class DescribeMigrationDetailRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * CreateConsumerGroup request structure.
 * @class
 */
class CreateConsumerGroupRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Consumer group name, which consists of numbers, letters (upper and lower case), or begins with _ - . Ends with numbers, letters (upper and lower case). The full name of the actually generated consumer group is in the form: consumer-grp-#{SubscribeId}-#{ConsumerGroupName}.
         * @type {string || null}
         */
        this.ConsumerGroupName = null;

        /**
         * Account name, which consists of numbers, letters (upper and lower case), or begins with _-.. Ends with numbers, letters (upper and lower case). The full name of the actually generated account is in the form: account-#{SubscribeId}-#{AccountName}.
         * @type {string || null}
         */
        this.AccountName = null;

        /**
         * Consumer group password, which should be longer than 3 characters.
         * @type {string || null}
         */
        this.Password = null;

        /**
         * Consumer group description
         * @type {string || null}
         */
        this.Description = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.ConsumerGroupName = 'ConsumerGroupName' in params ? params.ConsumerGroupName : null;
        this.AccountName = 'AccountName' in params ? params.AccountName : null;
        this.Password = 'Password' in params ? params.Password : null;
        this.Description = 'Description' in params ? params.Description : null;

    }
}

/**
 * ResizeSyncJob request structure.
 * @class
 */
class ResizeSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Task specification
         * @type {string || null}
         */
        this.NewInstanceClass = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.NewInstanceClass = 'NewInstanceClass' in params ? params.NewInstanceClass : null;

    }
}

/**
 * ModifySubscribeName response structure.
 * @class
 */
class ModifySubscribeNameResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DDL statement sync processing during data sync
 * @class
 */
class DdlOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * DDL type, such as database, table, view, and index.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DdlObject = null;

        /**
         * DDL value. Valid values: [Create,Drop,Alter] for database <br>[Create,Drop,Alter,Truncate,Rename] for table <br/>[Create,Drop] for view <br/>[Create,Drop] for index
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.DdlValue = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DdlObject = 'DdlObject' in params ? params.DdlObject : null;
        this.DdlValue = 'DdlValue' in params ? params.DdlValue : null;

    }
}

/**
 * Detailed description of conflict processing
 * @class
 */
class ConflictHandleOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * Conditionally overwritten column
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ConditionColumn = null;

        /**
         * Conditional overwrite operation
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ConditionOperator = null;

        /**
         * Conditional overwrite priority configuration
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ConditionOrderInSrcAndDst = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ConditionColumn = 'ConditionColumn' in params ? params.ConditionColumn : null;
        this.ConditionOperator = 'ConditionOperator' in params ? params.ConditionOperator : null;
        this.ConditionOrderInSrcAndDst = 'ConditionOrderInSrcAndDst' in params ? params.ConditionOrderInSrcAndDst : null;

    }
}

/**
 * Mongo output aggregation settings. Default value: Change Event.
 * @class
 */
class PipelineInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Aggregation operators: $addFields, $match, $project, $replaceRoot, $redact, $replaceWith, $set, $unset. $replaceWith, $set, $unset are available options for subscription instances that are version 4.2 or higher.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AggOp = null;

        /**
         * Aggregation expression must be in json format.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AggCmd = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AggOp = 'AggOp' in params ? params.AggOp : null;
        this.AggCmd = 'AggCmd' in params ? params.AggCmd : null;

    }
}

/**
 * ResumeSyncJob response structure.
 * @class
 */
class ResumeSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * RecoverMigrateJob response structure.
 * @class
 */
class RecoverMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyCompareTaskName response structure.
 * @class
 */
class ModifyCompareTaskNameResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * StartSyncJob request structure.
 * @class
 */
class StartSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * StartSubscribe request structure.
 * @class
 */
class StartSubscribeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * ModifyMigrateRuntimeAttribute response structure.
 * @class
 */
class ModifyMigrateRuntimeAttributeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeOffsetByTime response structure.
 * @class
 */
class DescribeOffsetByTimeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Time and Offset response.
         * @type {Array.<OffsetTimeMap> || null}
         */
        this.Items = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Items) {
            this.Items = new Array();
            for (let z in params.Items) {
                let obj = new OffsetTimeMap();
                obj.deserialize(params.Items[z]);
                this.Items.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * PauseSyncJob request structure.
 * @class
 */
class PauseSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * CreateMigrateCheckJob response structure.
 * @class
 */
class CreateMigrateCheckJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifySyncJobConfig request structure.
 * @class
 */
class ModifySyncJobConfigRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * The modified sync objects
         * @type {Objects || null}
         */
        this.DynamicObjects = null;

        /**
         * The modified sync task options
         * @type {DynamicOptions || null}
         */
        this.DynamicOptions = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

        if (params.DynamicObjects) {
            let obj = new Objects();
            obj.deserialize(params.DynamicObjects)
            this.DynamicObjects = obj;
        }

        if (params.DynamicOptions) {
            let obj = new DynamicOptions();
            obj.deserialize(params.DynamicOptions)
            this.DynamicOptions = obj;
        }

    }
}

/**
 * ContinueMigrateJob response structure.
 * @class
 */
class ContinueMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateMigrationService request structure.
 * @class
 */
class CreateMigrationServiceRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Source database type. Valid values: `mysql`, `redis`, `percona`, `mongodb`, `postgresql`, `sqlserver`, `mariadb`, and `cynosdbmysql`.
         * @type {string || null}
         */
        this.SrcDatabaseType = null;

        /**
         * Target database type. Valid values: `mysql`, `redis`, `percona`, `mongodb` ,`postgresql`, `sqlserver`, `mariadb`, and `cynosdbmysql`.
         * @type {string || null}
         */
        this.DstDatabaseType = null;

        /**
         * Source instance region, such as `ap-guangzhou`.
         * @type {string || null}
         */
        this.SrcRegion = null;

        /**
         * Target instance region, such as `ap-guangzhou`. Note that it must be the same as the API request region.
         * @type {string || null}
         */
        this.DstRegion = null;

        /**
         * Instance specification. Valid values: `small`, `medium`, `large`, `xlarge`, `2xlarge`.
         * @type {string || null}
         */
        this.InstanceClass = null;

        /**
         * Quantity. Value range: [1,15]. Default value: `1`.
         * @type {number || null}
         */
        this.Count = null;

        /**
         * Migration task name, which can contain up to 128 characters.
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Tag information
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SrcDatabaseType = 'SrcDatabaseType' in params ? params.SrcDatabaseType : null;
        this.DstDatabaseType = 'DstDatabaseType' in params ? params.DstDatabaseType : null;
        this.SrcRegion = 'SrcRegion' in params ? params.SrcRegion : null;
        this.DstRegion = 'DstRegion' in params ? params.DstRegion : null;
        this.InstanceClass = 'InstanceClass' in params ? params.InstanceClass : null;
        this.Count = 'Count' in params ? params.Count : null;
        this.JobName = 'JobName' in params ? params.JobName : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

    }
}

/**
 * Specific check item in this check step
 * @class
 */
class DetailCheckItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Check item name, such as source database permission check.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CheckItemName = null;

        /**
         * Check item details
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Description = null;

        /**
         * Check item result. Valid values: `pass` (pass); `failed` (failure); `warning` (pass with warning).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CheckResult = null;

        /**
         * The cause of the check item failure
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FailureReason = null;

        /**
         * Solution
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Solution = null;

        /**
         * Execution error log
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.ErrorLog = null;

        /**
         * URL of the detailed help document
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.HelpDoc = null;

        /**
         * Prompt text for ignoring a risk
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SkipInfo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CheckItemName = 'CheckItemName' in params ? params.CheckItemName : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.CheckResult = 'CheckResult' in params ? params.CheckResult : null;
        this.FailureReason = 'FailureReason' in params ? params.FailureReason : null;
        this.Solution = 'Solution' in params ? params.Solution : null;
        this.ErrorLog = 'ErrorLog' in params ? params.ErrorLog : null;
        this.HelpDoc = 'HelpDoc' in params ? params.HelpDoc : null;
        this.SkipInfo = 'SkipInfo' in params ? params.SkipInfo : null;

    }
}

/**
 * DescribeCompareTasks request structure.
 * @class
 */
class DescribeCompareTasksRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Number of tasks to be displayed per page. Default value: `20`.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Pagination offset
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Check task ID
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * Data consistency check task status. Valid values: `created`, `readyRun`, `running`, `success`, `stopping`, `failed`, `canceled`.
         * @type {Array.<string> || null}
         */
        this.Status = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.Status = 'Status' in params ? params.Status : null;

    }
}

/**
 * DestroyIsolatedSubscribe request structure.
 * @class
 */
class DestroyIsolatedSubscribeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * ResetSubscribe response structure.
 * @class
 */
class ResetSubscribeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Configuration of the data consistency check object
 * @class
 */
class CompareObject extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data comparison object mode (`all`: Entire instance; `partial`: Some objects)
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ObjectMode = null;

        /**
         * Object list
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<CompareObjectItem> || null}
         */
        this.ObjectItems = null;

        /**
         * Advanced object types, such as account, index, shardkey, schema.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.AdvancedObjects = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ObjectMode = 'ObjectMode' in params ? params.ObjectMode : null;

        if (params.ObjectItems) {
            this.ObjectItems = new Array();
            for (let z in params.ObjectItems) {
                let obj = new CompareObjectItem();
                obj.deserialize(params.ObjectItems[z]);
                this.ObjectItems.push(obj);
            }
        }
        this.AdvancedObjects = 'AdvancedObjects' in params ? params.AdvancedObjects : null;

    }
}

/**
 * DescribeCompareReport response structure.
 * @class
 */
class DescribeCompareReportResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Summary information of data consistency check
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareAbstractInfo || null}
         */
        this.Abstract = null;

        /**
         * Data consistency check details
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareDetailInfo || null}
         */
        this.Detail = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Abstract) {
            let obj = new CompareAbstractInfo();
            obj.deserialize(params.Abstract)
            this.Abstract = obj;
        }

        if (params.Detail) {
            let obj = new CompareDetailInfo();
            obj.deserialize(params.Detail)
            this.Detail = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * RecoverSyncJob response structure.
 * @class
 */
class RecoverSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Task operation information, which contains the list of all operations in the migration task as well as the list of allowed operations under the current status.
 * @class
 */
class MigrateAction extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of all operations in the task
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.AllAction = null;

        /**
         * List of allowed operations in the task under the current status
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.AllowedAction = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AllAction = 'AllAction' in params ? params.AllAction : null;
        this.AllowedAction = 'AllowedAction' in params ? params.AllowedAction : null;

    }
}

/**
 * ConfigureSubscribeJob response structure.
 * @class
 */
class ConfigureSubscribeJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeConsumerGroups request structure.
 * @class
 */
class DescribeConsumerGroupsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Starting offset for returned results. Default value: 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of results to be returned at a time. Default value: 10.
         * @type {number || null}
         */
        this.Limit = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

    }
}

/**
 * Kafka consumer group details
 * @class
 */
class GroupInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Consumer group account
         * @type {string || null}
         */
        this.Account = null;

        /**
         * Consumer group name
         * @type {string || null}
         */
        this.ConsumerGroupName = null;

        /**
         * Consumer group descriptionNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Description = null;

        /**
         * Consumer group offset. This field is for compatibility with the previous single partition scenario, where the value is the offset of the last partition. For the offset of each partition, please refer to the StateOfPartition field.
         * @type {number || null}
         */
        this.ConsumerGroupOffset = null;

        /**
         * The amount of data that has not been consumed by the consumer group. This field is for compatibility with the previous single partition scenario, where the value is the amount of unconsumed data in the last partition. For the amount of unconsumed data in each partition, refer to the StateOfPartition field.
         * @type {number || null}
         */
        this.ConsumerGroupLag = null;

        /**
         * Consumption delay (in seconds)
         * @type {number || null}
         */
        this.Latency = null;

        /**
         * Consumption status of each partition
         * @type {Array.<MonitorInfo> || null}
         */
        this.StateOfPartition = null;

        /**
         * Consumer group creation time, the format is: YYYY-MM-DD hh:mm:ss.
         * @type {string || null}
         */
        this.CreatedAt = null;

        /**
         * Consumer group update time, the format is: YYYY-MM-DD hh:mm:ss.
         * @type {string || null}
         */
        this.UpdatedAt = null;

        /**
         * Consumer group states, including Dead, Empty, Stable, etc. Only Dead and Empty states can perform reset operations.
         * @type {string || null}
         */
        this.ConsumerGroupState = null;

        /**
         * The partition is being consumed by each consumer.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<PartitionAssignment> || null}
         */
        this.PartitionAssignment = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Account = 'Account' in params ? params.Account : null;
        this.ConsumerGroupName = 'ConsumerGroupName' in params ? params.ConsumerGroupName : null;
        this.Description = 'Description' in params ? params.Description : null;
        this.ConsumerGroupOffset = 'ConsumerGroupOffset' in params ? params.ConsumerGroupOffset : null;
        this.ConsumerGroupLag = 'ConsumerGroupLag' in params ? params.ConsumerGroupLag : null;
        this.Latency = 'Latency' in params ? params.Latency : null;

        if (params.StateOfPartition) {
            this.StateOfPartition = new Array();
            for (let z in params.StateOfPartition) {
                let obj = new MonitorInfo();
                obj.deserialize(params.StateOfPartition[z]);
                this.StateOfPartition.push(obj);
            }
        }
        this.CreatedAt = 'CreatedAt' in params ? params.CreatedAt : null;
        this.UpdatedAt = 'UpdatedAt' in params ? params.UpdatedAt : null;
        this.ConsumerGroupState = 'ConsumerGroupState' in params ? params.ConsumerGroupState : null;

        if (params.PartitionAssignment) {
            this.PartitionAssignment = new Array();
            for (let z in params.PartitionAssignment) {
                let obj = new PartitionAssignment();
                obj.deserialize(params.PartitionAssignment[z]);
                this.PartitionAssignment.push(obj);
            }
        }

    }
}

/**
 * DeleteCompareTask response structure.
 * @class
 */
class DeleteCompareTaskResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Instance information
 * @class
 */
class DBEndpointInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Instance region
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Region = null;

        /**
         * Instances network access type. Valid values: `extranet` (public network); `ipv6` (public IPv6); `cvm` (self-build on CVM); `dcg` (Direct Connect); `vpncloud` (VPN access); `cdb` (database); `ccn` (CCN); `intranet` (intranet); `vpc` (VPC). Note that the valid values are subject to the current link.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Database type, such as `mysql`, `redis`, `mongodb`, `postgresql`, `mariadb`, and `percona`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseType = null;

        /**
         * Node type, empty or simple indicates a general node, cluster indicates a cluster node; for mongo services, valid values: replicaset (mongodb replica set), standalone (mongodb single node), cluster (mongodb cluster); for redis instances, valid values: empty or simple (single node), cluster (cluster), cluster-cache (cache cluster), cluster-proxy (proxy cluster).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NodeType = null;

        /**
         * Database information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DBInfo> || null}
         */
        this.Info = null;

        /**
         * Instance service provider, such as "aliyun" and "others".
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Supplier = null;

        /**
         * For MongoDB, you can define the following parameters: 	['AuthDatabase':'admin', 
'AuthFlag': "1",	'AuthMechanism':"SCRAM-SHA-1"]
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<KeyValuePairOption> || null}
         */
        this.ExtraAttr = null;

        /**
         * Network environment of the database. This parameter is required when `AccessType` is `ccn`. Valid values: `UserIDC` (user IDC), `TencentVPC` (Tencent Cloud VPC).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseNetEnv = null;

        /**
         * 
         * @type {string || null}
         */
        this.ConnectType = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Region = 'Region' in params ? params.Region : null;
        this.AccessType = 'AccessType' in params ? params.AccessType : null;
        this.DatabaseType = 'DatabaseType' in params ? params.DatabaseType : null;
        this.NodeType = 'NodeType' in params ? params.NodeType : null;

        if (params.Info) {
            this.Info = new Array();
            for (let z in params.Info) {
                let obj = new DBInfo();
                obj.deserialize(params.Info[z]);
                this.Info.push(obj);
            }
        }
        this.Supplier = 'Supplier' in params ? params.Supplier : null;

        if (params.ExtraAttr) {
            this.ExtraAttr = new Array();
            for (let z in params.ExtraAttr) {
                let obj = new KeyValuePairOption();
                obj.deserialize(params.ExtraAttr[z]);
                this.ExtraAttr.push(obj);
            }
        }
        this.DatabaseNetEnv = 'DatabaseNetEnv' in params ? params.DatabaseNetEnv : null;
        this.ConnectType = 'ConnectType' in params ? params.ConnectType : null;

    }
}

/**
 * ResumeSubscribe request structure.
 * @class
 */
class ResumeSubscribeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * ModifySyncJobConfig response structure.
 * @class
 */
class ModifySyncJobConfigResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Column options
 * @class
 */
class CompareColumnItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Column nameNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ColumnName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ColumnName = 'ColumnName' in params ? params.ColumnName : null;

    }
}

/**
 * DescribeSubscribeDetail response structure.
 * @class
 */
class DescribeSubscribeDetailResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The ID of the data subscription, such as subs-b6x64o31tm
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Data subscription instance name
         * @type {string || null}
         */
        this.SubscribeName = null;

        /**
         * Subscription database type. Currently, cynosdbmysql, mariadb, mongodb, mysql, percona, tdpg, tdsqlpercona are supported.
         * @type {string || null}
         */
        this.Product = null;

        /**
         * The subscribed cloud database instance ID. This value only makes sense if cloud database is subscribed. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * The subscribed cloud database instance status. This value only makes sense if cloud database is subscribed. Valid values: running, isolated, offline.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceStatus = null;

        /**
         * Subscription task billing status. Valid values: normal, isolating, isolated, offline, post2PrePayIng.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Subscription task status. Valid values: notStarted, checking, checkNotPass, checkPass, starting, running, error.
         * @type {string || null}
         */
        this.SubsStatus = null;

        /**
         * Modification time, the format is: Y-m-d h:m:s.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ModifyTime = null;

        /**
         * Creation time, the format is: Y-m-d h:m:s.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CreateTime = null;

        /**
         * Isolation time, the format is: Y-m-d h:m:s. Default time: 0000-00-00 00:00:00.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.IsolateTime = null;

        /**
         * Expiration time for monthly subscription tasks, the format is: Y-m-d h:m:s. Default time: 0000-00-00 00:00:00.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpireTime = null;

        /**
         * Offline time, the format is: Y-m-d h:m:s. Default time: 0000-00-00 00:00:00.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.OfflineTime = null;

        /**
         * Payment method. Valid values: 0 (monthly subscription); 1 (pay-as-you-go).
         * @type {number || null}
         */
        this.PayType = null;

        /**
         * Auto-renewal flag. It is meaningful only when PayType=0. Valid values: 0 (auto-renewal disabled); 1 (auto-renewal enabled).
         * @type {number || null}
         */
        this.AutoRenewFlag = null;

        /**
         * The region where the task is located
         * @type {string || null}
         */
        this.Region = null;

        /**
         * Kafka topic
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Topic = null;

        /**
         * Broker address of Kafka serviceNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Broker = null;

        /**
         * Data subscription type. Valid values for non-mongo Product: all (full instance update); dml (data update); ddl (structure update); dmlAndDdl (data + structure update). Valid values for mongo Product: all (full instance update); database (subscribe to a table); collection (subscribe to a collection).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SubscribeMode = null;

        /**
         * Subscription data format. If it is empty, the default format is used: mysql\cynosdbmysql\mariadb\percona\tdsqlpercona\tdpg is protobuf, mongo is json. When DatabaseType is mysql and cynosdbmysql, there are three optional protocols: protobuf\avro\json. For details on data format, please refer to the consumption demo documentation on the official website.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Protocol = null;

        /**
         * Information of subscribed tableNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SubscribeObject> || null}
         */
        this.SubscribeObjects = null;

        /**
         * Kafka configuration information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {SubscribeKafkaConfig || null}
         */
        this.KafkaConfig = null;

        /**
         * Source database access type. Valid values: extranet (public network); vpncloud (VPN access); dcg (Direct Connect); ccn (CCN); cdb (database); cvm (self-build on CVM); intranet (intranet); vpc (VPC). Note: The specific optional values depend on the current link support capabilities.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Access type information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<EndpointItem> || null}
         */
        this.Endpoints = null;

        /**
         * Mongo output aggregation settings
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<PipelineInfo> || null}
         */
        this.PipelineInfo = null;

        /**
         * TagNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Subscription task error information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SubsErr> || null}
         */
        this.Errors = null;

        /**
         * Additional information added for the business. The parameter name is called key, and the parameter value is called value.Optional parameters for mysql: ProcessXA. Fill in true to process, others will not be processed.Optional parameters for mongo: SubscribeType. Currently only changeStream is supported.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<KeyValuePairOption> || null}
         */
        this.ExtraAttr = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.SubscribeName = 'SubscribeName' in params ? params.SubscribeName : null;
        this.Product = 'Product' in params ? params.Product : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.InstanceStatus = 'InstanceStatus' in params ? params.InstanceStatus : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.SubsStatus = 'SubsStatus' in params ? params.SubsStatus : null;
        this.ModifyTime = 'ModifyTime' in params ? params.ModifyTime : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.IsolateTime = 'IsolateTime' in params ? params.IsolateTime : null;
        this.ExpireTime = 'ExpireTime' in params ? params.ExpireTime : null;
        this.OfflineTime = 'OfflineTime' in params ? params.OfflineTime : null;
        this.PayType = 'PayType' in params ? params.PayType : null;
        this.AutoRenewFlag = 'AutoRenewFlag' in params ? params.AutoRenewFlag : null;
        this.Region = 'Region' in params ? params.Region : null;
        this.Topic = 'Topic' in params ? params.Topic : null;
        this.Broker = 'Broker' in params ? params.Broker : null;
        this.SubscribeMode = 'SubscribeMode' in params ? params.SubscribeMode : null;
        this.Protocol = 'Protocol' in params ? params.Protocol : null;

        if (params.SubscribeObjects) {
            this.SubscribeObjects = new Array();
            for (let z in params.SubscribeObjects) {
                let obj = new SubscribeObject();
                obj.deserialize(params.SubscribeObjects[z]);
                this.SubscribeObjects.push(obj);
            }
        }

        if (params.KafkaConfig) {
            let obj = new SubscribeKafkaConfig();
            obj.deserialize(params.KafkaConfig)
            this.KafkaConfig = obj;
        }
        this.AccessType = 'AccessType' in params ? params.AccessType : null;

        if (params.Endpoints) {
            this.Endpoints = new Array();
            for (let z in params.Endpoints) {
                let obj = new EndpointItem();
                obj.deserialize(params.Endpoints[z]);
                this.Endpoints.push(obj);
            }
        }

        if (params.PipelineInfo) {
            this.PipelineInfo = new Array();
            for (let z in params.PipelineInfo) {
                let obj = new PipelineInfo();
                obj.deserialize(params.PipelineInfo[z]);
                this.PipelineInfo.push(obj);
            }
        }

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

        if (params.Errors) {
            this.Errors = new Array();
            for (let z in params.Errors) {
                let obj = new SubsErr();
                obj.deserialize(params.Errors[z]);
                this.Errors.push(obj);
            }
        }

        if (params.ExtraAttr) {
            this.ExtraAttr = new Array();
            for (let z in params.ExtraAttr) {
                let obj = new KeyValuePairOption();
                obj.deserialize(params.ExtraAttr[z]);
                this.ExtraAttr.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ContinueSyncJob response structure.
 * @class
 */
class ContinueSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Billing status information
 * @class
 */
class TradeInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Order number
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DealName = null;

        /**
         * Last order number
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.LastDealName = null;

        /**
         * Instance specification. Valid values: `micro`, `small`, `medium`, `large`, `xlarge`, `2xlarge`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceClass = null;

        /**
         * Task billing status. Valid values: `normal` (billed or to be billed); `resizing` (adjusting configuration); `reversing` (topping up, which is a short status); `isolating` (isolating, which is a short status); `isolated` (isolated); `offlining` (deleting); `offlined` (deleted); `notBilled` (not billed).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TradeStatus = null;

        /**
         * Expiration time in the format of "yyyy-mm-dd hh:mm:ss"
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpireTime = null;

        /**
         * Deletion time in the format of "yyyy-mm-dd hh:mm:ss"
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.OfflineTime = null;

        /**
         * Isolation time in the format of "yyyy-mm-dd hh:mm:ss"
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.IsolateTime = null;

        /**
         * The cause of deletion
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.OfflineReason = null;

        /**
         * The cause of isolation
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.IsolateReason = null;

        /**
         * Billing mode. Valid values: `postpay` (postpaid); `prepay` (prepaid).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.PayType = null;

        /**
         * Task billing type. Valid values: `billing` (billed); `notBilling` (free); `promotions` (in promotion).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.BillingType = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DealName = 'DealName' in params ? params.DealName : null;
        this.LastDealName = 'LastDealName' in params ? params.LastDealName : null;
        this.InstanceClass = 'InstanceClass' in params ? params.InstanceClass : null;
        this.TradeStatus = 'TradeStatus' in params ? params.TradeStatus : null;
        this.ExpireTime = 'ExpireTime' in params ? params.ExpireTime : null;
        this.OfflineTime = 'OfflineTime' in params ? params.OfflineTime : null;
        this.IsolateTime = 'IsolateTime' in params ? params.IsolateTime : null;
        this.OfflineReason = 'OfflineReason' in params ? params.OfflineReason : null;
        this.IsolateReason = 'IsolateReason' in params ? params.IsolateReason : null;
        this.PayType = 'PayType' in params ? params.PayType : null;
        this.BillingType = 'BillingType' in params ? params.BillingType : null;

    }
}

/**
 * Data sync options
 * @class
 */
class Options extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync initialization option. Valid values: `data` (full data initialization); `Structure` (structure initialization); `Full` (full data and structure initialization); `None` (incremental data only). Default value: `Full`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InitType = null;

        /**
         * Processing method for duplicate tables. Valid values: `ReportErrorAfterCheck`, `InitializeAfterDelete`, `ExecuteAfterIgnore`. Default value: `ReportErrorAfterCheck`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DealOfExistSameTable = null;

        /**
         * Conflict processing option. Valid values: `ReportError` (report an error); `Ignore` (ignore); `Cover` (overwrite); `ConditionCover` (conditionally overwrite). Default value: `ReportError`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ConflictHandleType = null;

        /**
         * Whether to add the additional column
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {boolean || null}
         */
        this.AddAdditionalColumn = null;

        /**
         * DML and DDL options to be synced. Valid values: `Insert` (INSERT operations); `Update` (UPDATE operations); `Delete` (DELETE operations); `DDL` (structure sync); `PartialDDL` (custom option, which is used together with `DdlOptions`). You can also leave this parameter empty.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.OpTypes = null;

        /**
         * Detailed option for conflict processing, such as condition rows and operations in conditional overwrite.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ConflictHandleOption || null}
         */
        this.ConflictHandleOption = null;

        /**
         * DDL statements to be synced
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DdlOption> || null}
         */
        this.DdlOptions = null;

        /**
         * Kafka sync options
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {KafkaOption || null}
         */
        this.KafkaOption = null;

        /**
         * Task speed limit information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {RateLimitOption || null}
         */
        this.RateLimitOption = null;

        /**
         * Settings of the automatic retry time range
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.AutoRetryTimeRangeMinutes = null;

        /**
         * 
         * @type {boolean || null}
         */
        this.FilterBeginCommit = null;

        /**
         * 
         * @type {boolean || null}
         */
        this.FilterCheckpoint = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.InitType = 'InitType' in params ? params.InitType : null;
        this.DealOfExistSameTable = 'DealOfExistSameTable' in params ? params.DealOfExistSameTable : null;
        this.ConflictHandleType = 'ConflictHandleType' in params ? params.ConflictHandleType : null;
        this.AddAdditionalColumn = 'AddAdditionalColumn' in params ? params.AddAdditionalColumn : null;
        this.OpTypes = 'OpTypes' in params ? params.OpTypes : null;

        if (params.ConflictHandleOption) {
            let obj = new ConflictHandleOption();
            obj.deserialize(params.ConflictHandleOption)
            this.ConflictHandleOption = obj;
        }

        if (params.DdlOptions) {
            this.DdlOptions = new Array();
            for (let z in params.DdlOptions) {
                let obj = new DdlOption();
                obj.deserialize(params.DdlOptions[z]);
                this.DdlOptions.push(obj);
            }
        }

        if (params.KafkaOption) {
            let obj = new KafkaOption();
            obj.deserialize(params.KafkaOption)
            this.KafkaOption = obj;
        }

        if (params.RateLimitOption) {
            let obj = new RateLimitOption();
            obj.deserialize(params.RateLimitOption)
            this.RateLimitOption = obj;
        }
        this.AutoRetryTimeRangeMinutes = 'AutoRetryTimeRangeMinutes' in params ? params.AutoRetryTimeRangeMinutes : null;
        this.FilterBeginCommit = 'FilterBeginCommit' in params ? params.FilterBeginCommit : null;
        this.FilterCheckpoint = 'FilterCheckpoint' in params ? params.FilterCheckpoint : null;

    }
}

/**
 * DeleteConsumerGroup request structure.
 * @class
 */
class DeleteConsumerGroupRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * ID of the data subscription instance
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Consumer group name. The full name of the actual consumer group is in the form: consumer-grp-#{SubscribeId}-#{ConsumerGroupName}.Please make sure the consumer group name is correct.
         * @type {string || null}
         */
        this.ConsumerGroupName = null;

        /**
         * Account name. The full name of the actual account is in the form: account-#{SubscribeId}-#{AccountName}.Please make sure the account name is correct.
         * @type {string || null}
         */
        this.AccountName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.ConsumerGroupName = 'ConsumerGroupName' in params ? params.ConsumerGroupName : null;
        this.AccountName = 'AccountName' in params ? params.AccountName : null;

    }
}

/**
 * ModifySubscribeAutoRenewFlag request structure.
 * @class
 */
class ModifySubscribeAutoRenewFlagRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Auto-renewal flag. Valid values: 1 (auto-renewal enabled); 0 (auto-renewal disabled).
         * @type {number || null}
         */
        this.AutoRenewFlag = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.AutoRenewFlag = 'AutoRenewFlag' in params ? params.AutoRenewFlag : null;

    }
}

/**
 * CompleteMigrateJob request structure.
 * @class
 */
class CompleteMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * The way to complete the task, which is supported only for legacy MySQL migration tasks. Valid values: `waitForSync` (wait for the source-replica lag to become 0 before stopping); `immediately` (complete immediately without waiting for source-replica sync). Default value: `waitForSync`.
         * @type {string || null}
         */
        this.CompleteMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompleteMode = 'CompleteMode' in params ? params.CompleteMode : null;

    }
}

/**
 * CreateConsumerGroup response structure.
 * @class
 */
class CreateConsumerGroupResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * StopCompare request structure.
 * @class
 */
class StopCompareRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task ID in the format of `dts-8yv4w2i1-cmp-37skmii9`
         * @type {string || null}
         */
        this.CompareTaskId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;

    }
}

/**
 * Node information of multi-node databases configured for data sync. This data structure is valid for multi-node databases such as TDSQL for MySQL. For single-node databases such as MySQL, use `Endpoint` instead.
 * @class
 */
class SyncDBEndpointInfos extends  AbstractModel {
    constructor(){
        super();

        /**
         * Region of the database
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Region = null;

        /**
         * Instance network access type. Valid values: `extranet` (public network); `ipv6` (public IPv6); `cvm` (self-build on CVM); `dcg` (Direct Connect); `vpncloud` (VPN access); `cdb` (database); `ccn` (CCN); `intranet` (intranet); `vpc` (VPC). Note that the valid values are subject to the current link.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Database type, such as `mysql`, `redis`, `mongodb`, `postgresql`, `mariadb`, and `percona`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseType = null;

        /**
         * Database information. Note: If the data type is tdsqlmysql, the order of this Endpoint array should correspond to the set order, and the first shard (shardkey range starting from 0) must be entered first.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<Endpoint> || null}
         */
        this.Info = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Region = 'Region' in params ? params.Region : null;
        this.AccessType = 'AccessType' in params ? params.AccessType : null;
        this.DatabaseType = 'DatabaseType' in params ? params.DatabaseType : null;

        if (params.Info) {
            this.Info = new Array();
            for (let z in params.Info) {
                let obj = new Endpoint();
                obj.deserialize(params.Info[z]);
                this.Info.push(obj);
            }
        }

    }
}

/**
 * StartModifySyncJob request structure.
 * @class
 */
class StartModifySyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * DescribeCheckSyncJobResult response structure.
 * @class
 */
class DescribeCheckSyncJobResultResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Execution status of the check task. Valid values: `notStarted`, `running`, `failed`, `success`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Total number of steps
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepCount = null;

        /**
         * The current step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepCur = null;

        /**
         * Overall progress. Value range: 0-100.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Progress = null;

        /**
         * Step information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepInfo> || null}
         */
        this.StepInfos = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Status = 'Status' in params ? params.Status : null;
        this.StepCount = 'StepCount' in params ? params.StepCount : null;
        this.StepCur = 'StepCur' in params ? params.StepCur : null;
        this.Progress = 'Progress' in params ? params.Progress : null;

        if (params.StepInfos) {
            this.StepInfos = new Array();
            for (let z in params.StepInfos) {
                let obj = new StepInfo();
                obj.deserialize(params.StepInfos[z]);
                this.StepInfos.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * StopSyncJob response structure.
 * @class
 */
class StopSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Migration options, which describe how the task performs migration.
 * @class
 */
class MigrateOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration object options, which tell DTS which database/table objects should be migrated.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {DatabaseTableObject || null}
         */
        this.DatabaseTable = null;

        /**
         * Migration type. Valid values: `full`, `structure`, `fullAndIncrement`. Default value: `fullAndIncrement`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.MigrateType = null;

        /**
         * Data consistency check option. Data consistency check is disabled by default.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ConsistencyOption || null}
         */
        this.Consistency = null;

        /**
         * Whether to migrate accounts. Valid values: `yes`, `no`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {boolean || null}
         */
        this.IsMigrateAccount = null;

        /**
         * Whether to use the `Root` account in the source database to overwrite that in the target database. Valid values: `false`, `true`. For database/table or structural migration, you should specify `false`. Note that this parameter takes effect only for OldDTS.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {boolean || null}
         */
        this.IsOverrideRoot = null;

        /**
         * Whether to set the target database to read-only during migration, which takes effect only for MySQL databases. Valid values: `true`, `false`. Default value: `false`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {boolean || null}
         */
        this.IsDstReadOnly = null;

        /**
         * Additional information. You can set additional parameters for certain database types. For Redis, you can define the following parameters: 
["DstWriteMode": `normal`. 	Target database write mode. Valid values: `clearData` (Clear the target instance data), overwrite` (Execute the task in overwriting mode), `normal` (Follow the normal steps) 	"IsDstReadOnly": `true`. 	Whether to set the target database to read-only for a migration task. Valid values: `true` (Yes), `false` (No) 	"ClientOutputBufferHardLimit": 512. 	Hard limit of the replica buffer zone capacity in MB. 	"ClientOutputBufferSoftLimit": 512. 	Soft limit of the replica buffer zone capacity in MB. 	"ClientOutputBufferPersistTime": 60. Soft limit duration of the replica buffer zone in seconds. 	"ReplBacklogSize": 512, 	Limit of the circular buffer zone capacity in MB. 	"ReplTimeout":120,		Replication timeout period in seconds]
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<KeyValuePairOption> || null}
         */
        this.ExtraAttr = null;

        /**
         * 
         * @type {string || null}
         */
        this.MigrateWay = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.DatabaseTable) {
            let obj = new DatabaseTableObject();
            obj.deserialize(params.DatabaseTable)
            this.DatabaseTable = obj;
        }
        this.MigrateType = 'MigrateType' in params ? params.MigrateType : null;

        if (params.Consistency) {
            let obj = new ConsistencyOption();
            obj.deserialize(params.Consistency)
            this.Consistency = obj;
        }
        this.IsMigrateAccount = 'IsMigrateAccount' in params ? params.IsMigrateAccount : null;
        this.IsOverrideRoot = 'IsOverrideRoot' in params ? params.IsOverrideRoot : null;
        this.IsDstReadOnly = 'IsDstReadOnly' in params ? params.IsDstReadOnly : null;

        if (params.ExtraAttr) {
            this.ExtraAttr = new Array();
            for (let z in params.ExtraAttr) {
                let obj = new KeyValuePairOption();
                obj.deserialize(params.ExtraAttr[z]);
                this.ExtraAttr.push(obj);
            }
        }
        this.MigrateWay = 'MigrateWay' in params ? params.MigrateWay : null;

    }
}

/**
 * DescribeSubscribeDetail request structure.
 * @class
 */
class DescribeSubscribeDetailRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * Details of skipped tables
 * @class
 */
class SkippedDetail extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of skipped tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Details of skipped tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SkippedItem> || null}
         */
        this.Items = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.Items) {
            this.Items = new Array();
            for (let z in params.Items) {
                let obj = new SkippedItem();
                obj.deserialize(params.Items[z]);
                this.Items.push(obj);
            }
        }

    }
}

/**
 * Subscription error message
 * @class
 */
class SubsErr extends  AbstractModel {
    constructor(){
        super();

        /**
         * Error message
         * @type {string || null}
         */
        this.Message = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Message = 'Message' in params ? params.Message : null;

    }
}

/**
 * CreateSubscribe response structure.
 * @class
 */
class CreateSubscribeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Array of data subscription instance IDs
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.SubscribeIds = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeIds = 'SubscribeIds' in params ? params.SubscribeIds : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Consistency check options
 * @class
 */
class CompareOptions extends  AbstractModel {
    constructor(){
        super();

        /**
         * Comparative Method: dataCheck (Complete Data Comparison), sampleDataCheck (Sampling Data Comparison), rowsCount (Row Count Comparison)Note: This field may return null, indicating that no valid value can be obtained.
         * @type {string || null}
         */
        this.Method = null;

        /**
         * Sampling rate. Value range: 0-100%.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.SampleRate = null;

        /**
         * The number of threads, which defaults to 1. Value range: 1-5.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.ThreadCount = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Method = 'Method' in params ? params.Method : null;
        this.SampleRate = 'SampleRate' in params ? params.SampleRate : null;
        this.ThreadCount = 'ThreadCount' in params ? params.ThreadCount : null;

    }
}

/**
 * ModifyMigrateName response structure.
 * @class
 */
class ModifyMigrateNameResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeMigrationJobs response structure.
 * @class
 */
class DescribeMigrationJobsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of migration tasks
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Migration task list
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<JobItem> || null}
         */
        this.JobList = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.JobList) {
            this.JobList = new Array();
            for (let z in params.JobList) {
                let obj = new JobItem();
                obj.deserialize(params.JobList[z]);
                this.JobList.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyMigrationJob request structure.
 * @class
 */
class ModifyMigrationJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Running mode. Valid values: `immediate`, `timed`.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Migration task configuration options, which describe how the task performs migration. The `RateLimitOption` option cannot be configured. To modify the speed limit settings of the task, use the `ModifyMigrateRateLimit` API after the task starts running.
         * @type {MigrateOption || null}
         */
        this.MigrateOption = null;

        /**
         * Source instance information
         * @type {DBEndpointInfo || null}
         */
        this.SrcInfo = null;

        /**
         * Target instance information
         * @type {DBEndpointInfo || null}
         */
        this.DstInfo = null;

        /**
         * Migration task name, which can contain up to 128 characters.
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Expected start time in the format of "2006-01-02 15:04:05", which is required if `RunMode` is `timed`.
         * @type {string || null}
         */
        this.ExpectRunTime = null;

        /**
         * Tag information
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Automatic retry time, which can be set to 5-720 minutes. 0 indicates that retry is disabled.
         * @type {number || null}
         */
        this.AutoRetryTimeRangeMinutes = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.RunMode = 'RunMode' in params ? params.RunMode : null;

        if (params.MigrateOption) {
            let obj = new MigrateOption();
            obj.deserialize(params.MigrateOption)
            this.MigrateOption = obj;
        }

        if (params.SrcInfo) {
            let obj = new DBEndpointInfo();
            obj.deserialize(params.SrcInfo)
            this.SrcInfo = obj;
        }

        if (params.DstInfo) {
            let obj = new DBEndpointInfo();
            obj.deserialize(params.DstInfo)
            this.DstInfo = obj;
        }
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.ExpectRunTime = 'ExpectRunTime' in params ? params.ExpectRunTime : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }
        this.AutoRetryTimeRangeMinutes = 'AutoRetryTimeRangeMinutes' in params ? params.AutoRetryTimeRangeMinutes : null;

    }
}

/**
 * StopCompare response structure.
 * @class
 */
class StopCompareResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DestroyMigrateJob response structure.
 * @class
 */
class DestroyMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Task step information
 * @class
 */
class ProcessProgress extends  AbstractModel {
    constructor(){
        super();

        /**
         * Step status. Valid values: `notStarted`, `running`, `success`, `failed`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Progress information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Percent = null;

        /**
         * Total number of steps
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepAll = null;

        /**
         * Current step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNow = null;

        /**
         * The prompt output in the current step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Step information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepDetailInfo> || null}
         */
        this.Steps = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Status = 'Status' in params ? params.Status : null;
        this.Percent = 'Percent' in params ? params.Percent : null;
        this.StepAll = 'StepAll' in params ? params.StepAll : null;
        this.StepNow = 'StepNow' in params ? params.StepNow : null;
        this.Message = 'Message' in params ? params.Message : null;

        if (params.Steps) {
            this.Steps = new Array();
            for (let z in params.Steps) {
                let obj = new StepDetailInfo();
                obj.deserialize(params.Steps[z]);
                this.Steps.push(obj);
            }
        }

    }
}

/**
 * SkipSyncCheckItem request structure.
 * @class
 */
class SkipSyncCheckItemRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID, such as "sync-4ddgid2".
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * ID of the check step to be skipped, which is obtained in the `StepInfos[i].StepId` field returned by the `DescribeCheckSyncJobResult` API, such as "OptimizeCheck".
         * @type {Array.<string> || null}
         */
        this.StepIds = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.StepIds = 'StepIds' in params ? params.StepIds : null;

    }
}

/**
 * DescribeModifyCheckSyncJobResult request structure.
 * @class
 */
class DescribeModifyCheckSyncJobResultRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * SkipSyncCheckItem response structure.
 * @class
 */
class SkipSyncCheckItemResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * IsolateSyncJob response structure.
 * @class
 */
class IsolateSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateMigrateCheckJob request structure.
 * @class
 */
class CreateMigrateCheckJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * ModifyConsumerGroupPassword response structure.
 * @class
 */
class ModifyConsumerGroupPasswordResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeMigrationJobs request structure.
 * @class
 */
class DescribeMigrationJobsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID such as `dts-amm1jw5q`
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data migration task name
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Data migration task status. Valid values: `created`, `checking`, `checkPass`, `checkNotPass`, `readyRun`, `running`, `readyComplete`, `success`, `failed`, `stopping`, `completing`.
         * @type {Array.<string> || null}
         */
        this.Status = null;

        /**
         * Source instance ID in the format of `cdb-c1nl9rpv`
         * @type {string || null}
         */
        this.SrcInstanceId = null;

        /**
         * Source instance region, such as `ap-guangzhou`.
         * @type {string || null}
         */
        this.SrcRegion = null;

        /**
         * Source database type, such as `sqlserver`, `mysql`, `mongodb`, `redis`, `tendis`, `keewidb`, `clickhouse`, `cynosdbmysql`, `percona`, `tdsqlpercona`, `mariadb`, `tdsqlmysql`, `postgresql.
         * @type {Array.<string> || null}
         */
        this.SrcDatabaseType = null;

        /**
         * Source instance access type. Valid values: `extranet` (public network); `vpncloud` (VPN access); `dcg` (Direct Connect); `ccn` (CCN); `cdb` (Database); `cvm` (self-build on CVM).
         * @type {Array.<string> || null}
         */
        this.SrcAccessType = null;

        /**
         * Target instance ID in the format of `cdb-c1nl9rpv`
         * @type {string || null}
         */
        this.DstInstanceId = null;

        /**
         * Target instance region, such as `ap-guangzhou`.
         * @type {string || null}
         */
        this.DstRegion = null;

        /**
         * Target database type, such as `sqlserver`, `mysql`, `mongodb`, `redis`, `tendis`, `keewidb`, `clickhouse`, `cynosdbmysql`, `percona`, `tdsqlpercona`, `mariadb`, `tdsqlmysql`, `postgresql.
         * @type {Array.<string> || null}
         */
        this.DstDatabaseType = null;

        /**
         * Target instance access type. Valid values: `extranet` (public network); `vpncloud` (VPN access); `dcg` (Direct Connect); `ccn` (CCN); `cdb` (Database); `cvm` (self-build on CVM).
         * @type {Array.<string> || null}
         */
        this.DstAccessType = null;

        /**
         * Task running mode. Valid values: `immediate`, `timed`.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Sorting order. Valid values: `asc`, `desc`. Default value: `desc` by creation time.
         * @type {string || null}
         */
        this.OrderSeq = null;

        /**
         * Number of instances to be returned. Value range: [1,100]. Default value: `20`.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Offset. Default value: `0`.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Tag filter
         * @type {Array.<TagFilter> || null}
         */
        this.TagFilters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.SrcInstanceId = 'SrcInstanceId' in params ? params.SrcInstanceId : null;
        this.SrcRegion = 'SrcRegion' in params ? params.SrcRegion : null;
        this.SrcDatabaseType = 'SrcDatabaseType' in params ? params.SrcDatabaseType : null;
        this.SrcAccessType = 'SrcAccessType' in params ? params.SrcAccessType : null;
        this.DstInstanceId = 'DstInstanceId' in params ? params.DstInstanceId : null;
        this.DstRegion = 'DstRegion' in params ? params.DstRegion : null;
        this.DstDatabaseType = 'DstDatabaseType' in params ? params.DstDatabaseType : null;
        this.DstAccessType = 'DstAccessType' in params ? params.DstAccessType : null;
        this.RunMode = 'RunMode' in params ? params.RunMode : null;
        this.OrderSeq = 'OrderSeq' in params ? params.OrderSeq : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Offset = 'Offset' in params ? params.Offset : null;

        if (params.TagFilters) {
            this.TagFilters = new Array();
            for (let z in params.TagFilters) {
                let obj = new TagFilter();
                obj.deserialize(params.TagFilters[z]);
                this.TagFilters.push(obj);
            }
        }

    }
}

/**
 * Data consistency check result
 * @class
 */
class CompareTaskInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data consistency check task ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * Data consistency check result. Valid values: `unstart` (the task is not started); `running` (the task is running); `canceled` (the task is stopped); `failed` (the task failed); `inconsistent` (the data is inconsistent); `consistent` (the data is consistent); `notexist` (the task does not exist).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.Status = 'Status' in params ? params.Status : null;

    }
}

/**
 * ModifyConsumerGroupDescription request structure.
 * @class
 */
class ModifyConsumerGroupDescriptionRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Consumer group name. The full name of the actual consumer group is in the form: consumer-grp-#{SubscribeId}-#{ConsumerGroupName}.Please make sure the consumer group name is correct.
         * @type {string || null}
         */
        this.ConsumerGroupName = null;

        /**
         * Account name. The full name of the actual account is in the form: account-#{SubscribeId}-#{AccountName}.Please make sure the account name is correct.
         * @type {string || null}
         */
        this.AccountName = null;

        /**
         * Updated description of the consumer group
         * @type {string || null}
         */
        this.Description = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.ConsumerGroupName = 'ConsumerGroupName' in params ? params.ConsumerGroupName : null;
        this.AccountName = 'AccountName' in params ? params.AccountName : null;
        this.Description = 'Description' in params ? params.Description : null;

    }
}

/**
 * ContinueSyncJob request structure.
 * @class
 */
class ContinueSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * ModifySubscribeObjects response structure.
 * @class
 */
class ModifySubscribeObjectsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateMigrationService response structure.
 * @class
 */
class CreateMigrationServiceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The list of migration task IDs randomly generated in the format of `dts-c1f6rs21` after a successful order placement
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.JobIds = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobIds = 'JobIds' in params ? params.JobIds : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Sync options configured when the target database is Kafka
 * @class
 */
class KafkaOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data type delivered to Kafka, such as Avro, Json, canal-pb, canal-json
         * @type {string || null}
         */
        this.DataType = null;

        /**
         * Topic sync policy, such as `Single` (deliver all data to a single topic), `Multi` (deliver data to multiple custom topics).
         * @type {string || null}
         */
        this.TopicType = null;

        /**
         * Topic for DDL storage
         * @type {string || null}
         */
        this.DDLTopicName = null;

        /**
         * Topic description
         * @type {Array.<TopicRule> || null}
         */
        this.TopicRules = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DataType = 'DataType' in params ? params.DataType : null;
        this.TopicType = 'TopicType' in params ? params.TopicType : null;
        this.DDLTopicName = 'DDLTopicName' in params ? params.DDLTopicName : null;

        if (params.TopicRules) {
            this.TopicRules = new Array();
            for (let z in params.TopicRules) {
                let obj = new TopicRule();
                obj.deserialize(params.TopicRules[z]);
                this.TopicRules.push(obj);
            }
        }

    }
}

/**
 * DescribeMigrationCheckJob response structure.
 * @class
 */
class DescribeMigrationCheckJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Check task execution status. Valid values: `notStarted`, `running`, `failed`, `success`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Check task result message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.BriefMsg = null;

        /**
         * Check step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<CheckStep> || null}
         */
        this.StepInfo = null;

        /**
         * Check result. Valid values: `checkPass`, `checkNotPass`.
         * @type {string || null}
         */
        this.CheckFlag = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Status = 'Status' in params ? params.Status : null;
        this.BriefMsg = 'BriefMsg' in params ? params.BriefMsg : null;

        if (params.StepInfo) {
            this.StepInfo = new Array();
            for (let z in params.StepInfo) {
                let obj = new CheckStep();
                obj.deserialize(params.StepInfo[z]);
                this.StepInfo.push(obj);
            }
        }
        this.CheckFlag = 'CheckFlag' in params ? params.CheckFlag : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * StopSyncJob request structure.
 * @class
 */
class StopSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * Details of inconsistent tables
 * @class
 */
class DifferenceDetail extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of inconsistent tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Details of inconsistent tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DifferenceItem> || null}
         */
        this.Items = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.Items) {
            this.Items = new Array();
            for (let z in params.Items) {
                let obj = new DifferenceItem();
                obj.deserialize(params.Items[z]);
                this.Items.push(obj);
            }
        }

    }
}

/**
 * Database information
 * @class
 */
class DBInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Node role in a distributed database, such as the mongos node in MongoDB.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Role = null;

        /**
         * Kernel version, such as the different kernel versions of MariaDB.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbKernel = null;

        /**
         * Instance IP address, which is required for the following access types: public network, Direct Connect, VPN, CCN, intranet, and VPC.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Host = null;

        /**
         * Instance port, which is required for the following access types: public network, self-build on CVM, Direct Connect, VPN, CCN, intranet, and VPC.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Port = null;

        /**
         * Instance username
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.User = null;

        /**
         * Instance password
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Password = null;

        /**
         * Short CVM instance ID in the format of `ins-olgl39y8`, which is required if the access type is `cvm`. It is the same as the instance ID displayed in the CVM console.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CvmInstanceId = null;

        /**
         * VPN gateway ID in the format of `vpngw-9ghexg7q`, which is required if the access type is `vpncloud`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UniqVpnGwId = null;

        /**
         * Direct Connect gateway ID in the format of `dcg-0rxtqqxb`, which is required if the access type is `dcg`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UniqDcgId = null;

        /**
         * Database instance ID in the format of `cdb-powiqx8q`, which is required if the access type is `cdb`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * CCN instance ID such as `ccn-afp6kltc`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CcnGwId = null;

        /**
         * VPC ID in the format of `vpc-92jblxto`, which is required if the access type is `vpc`, `vpncloud`, `ccn`, or `dcg`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * ID of the subnet in the VPC in the format of `subnet-3paxmkdz`, which is required if the access type is `vpc`, `vpncloud`, `ccn`, or `dcg`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SubnetId = null;

        /**
         * Database version in the format of `5.6` or `5.7`, which takes effect only if the instance is an RDS instance. Default value: `5.6`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EngineVersion = null;

        /**
         * Instance account
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Account = null;

        /**
         * The role used for cross-account migration, which can contain [a-zA-Z0-9\-\_]+.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccountRole = null;

        /**
         * The account to which the resource belongs. Valid values: empty or `self` (the current account); `other` (another account).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccountMode = null;

        /**
         * Temporary SecretId, you can obtain the temporary key by [GetFederationToken](https://intl.cloud.tencent.com/document/product/1312/48195?from_cn_redirect=1).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TmpSecretId = null;

        /**
         * Temporary SecretKey, you can obtain the temporary key by [GetFederationToken](https://intl.cloud.tencent.com/document/product/1312/48195?from_cn_redirect=1).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TmpSecretKey = null;

        /**
         * Temporary token, you can obtain the temporary key by [GetFederationToken](https://intl.cloud.tencent.com/document/product/1312/48195?from_cn_redirect=1).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TmpToken = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Role = 'Role' in params ? params.Role : null;
        this.DbKernel = 'DbKernel' in params ? params.DbKernel : null;
        this.Host = 'Host' in params ? params.Host : null;
        this.Port = 'Port' in params ? params.Port : null;
        this.User = 'User' in params ? params.User : null;
        this.Password = 'Password' in params ? params.Password : null;
        this.CvmInstanceId = 'CvmInstanceId' in params ? params.CvmInstanceId : null;
        this.UniqVpnGwId = 'UniqVpnGwId' in params ? params.UniqVpnGwId : null;
        this.UniqDcgId = 'UniqDcgId' in params ? params.UniqDcgId : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.CcnGwId = 'CcnGwId' in params ? params.CcnGwId : null;
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.SubnetId = 'SubnetId' in params ? params.SubnetId : null;
        this.EngineVersion = 'EngineVersion' in params ? params.EngineVersion : null;
        this.Account = 'Account' in params ? params.Account : null;
        this.AccountRole = 'AccountRole' in params ? params.AccountRole : null;
        this.AccountMode = 'AccountMode' in params ? params.AccountMode : null;
        this.TmpSecretId = 'TmpSecretId' in params ? params.TmpSecretId : null;
        this.TmpSecretKey = 'TmpSecretKey' in params ? params.TmpSecretKey : null;
        this.TmpToken = 'TmpToken' in params ? params.TmpToken : null;

    }
}

/**
 * Topic description
 * @class
 */
class TopicRule extends  AbstractModel {
    constructor(){
        super();

        /**
         * Topic name
         * @type {string || null}
         */
        this.TopicName = null;

        /**
         * Topic partitioning policy. If the topic sync policy is delivering data to multiple custom topics (`TopicType` = `Multi`), the value of this parameter is `Random` (deliver to a random partition). If the topic sync policy is delivering all data to a single topic (`TopicType` = `Single`), this parameter has three valid values: `AllInPartitionZero` (deliver all data to partition0), `PartitionByTable` (partition by table name), `PartitionByTableAndKey` (partition by table name and primary key).
         * @type {string || null}
         */
        this.PartitionType = null;

        /**
         * Database name matching rule. This parameter takes effect only when `TopicType` is `Multi`. Valid values: `Regular` (match by regex), `Default` (default rule for the remaining databases that cannot be matched by regex). The default rule must be included in the array of matching rules.
         * @type {string || null}
         */
        this.DbMatchMode = null;

        /**
         * Database name, which can only be matched by regex when `TopicType` is `Multi` and `DbMatchMode` is `Regular`.
         * @type {string || null}
         */
        this.DbName = null;

        /**
         * Table name matching rule. This parameter takes effect only when `TopicType` is `Multi`. Valid values: `Regular` (match by regex), `Default` (default rule for the remaining databases that cannot be matched by regex). The default rule must be included in the array of matching rules.
         * @type {string || null}
         */
        this.TableMatchMode = null;

        /**
         * Table name, which can only be matched by regex when `TopicType` is `Multi` and `DbMatchMode` is `Regular`.
         * @type {string || null}
         */
        this.TableName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TopicName = 'TopicName' in params ? params.TopicName : null;
        this.PartitionType = 'PartitionType' in params ? params.PartitionType : null;
        this.DbMatchMode = 'DbMatchMode' in params ? params.DbMatchMode : null;
        this.DbName = 'DbName' in params ? params.DbName : null;
        this.TableMatchMode = 'TableMatchMode' in params ? params.TableMatchMode : null;
        this.TableName = 'TableName' in params ? params.TableName : null;

    }
}

/**
 * DestroySyncJob request structure.
 * @class
 */
class DestroySyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * View object
 * @class
 */
class ViewItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * View name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ViewName = null;

        /**
         * View name after migration
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewViewName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ViewName = 'ViewName' in params ? params.ViewName : null;
        this.NewViewName = 'NewViewName' in params ? params.NewViewName : null;

    }
}

/**
 * CreateCheckSyncJob response structure.
 * @class
 */
class CreateCheckSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateSubscribeCheckJob response structure.
 * @class
 */
class CreateSubscribeCheckJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyConsumerGroupDescription response structure.
 * @class
 */
class ModifyConsumerGroupDescriptionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Database/Table objects for data consistency check
 * @class
 */
class CompareObjectItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Database name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbName = null;

        /**
         * Database selection mode. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbMode = null;

        /**
         * Schema name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SchemaName = null;

        /**
         * Schema selection mode. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableMode = null;

        /**
         * Table configuration for data consistency check, which is required if `TableMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<CompareTableItem> || null}
         */
        this.Tables = null;

        /**
         * View selection mode: all refers to all view objects under the current object, partial refers to partial view objects (consistency check does not check views, and the current parameters are disabled).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ViewMode = null;

        /**
         * View configuration used for consistency check. When ViewMode is partial, it needs to be filled in (consistency check does not check views, and the current parameters are disabled).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<CompareViewItem> || null}
         */
        this.Views = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DbName = 'DbName' in params ? params.DbName : null;
        this.DbMode = 'DbMode' in params ? params.DbMode : null;
        this.SchemaName = 'SchemaName' in params ? params.SchemaName : null;
        this.TableMode = 'TableMode' in params ? params.TableMode : null;

        if (params.Tables) {
            this.Tables = new Array();
            for (let z in params.Tables) {
                let obj = new CompareTableItem();
                obj.deserialize(params.Tables[z]);
                this.Tables.push(obj);
            }
        }
        this.ViewMode = 'ViewMode' in params ? params.ViewMode : null;

        if (params.Views) {
            this.Views = new Array();
            for (let z in params.Views) {
                let obj = new CompareViewItem();
                obj.deserialize(params.Views[z]);
                this.Views.push(obj);
            }
        }

    }
}

/**
 * ConfigureSyncJob request structure.
 * @class
 */
class ConfigureSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task instance ID in the format of `sync-werwfs23`, which is used to identify a sync task.
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Source database access type. Valid values: `cdb` (database); `cvm` (self-build on CVM); `vpc` (VPC); `extranet` (public network); `vpncloud` (VPN access); `dcg` (Direct Connect); `ccn` (CCN); `intranet` (intranet). Note that the valid values are subject to the current link.
         * @type {string || null}
         */
        this.SrcAccessType = null;

        /**
         * Target database access type. Valid values: `cdb` (database); `cvm` (self-build on CVM); `vpc` (VPC); `extranet` (public network); `vpncloud` (VPN access); `dcg` (Direct Connect); `ccn` (CCN); `intranet` (intranet); `ckafka` (CKafka instance). Note that the valid values are subject to the current link.
         * @type {string || null}
         */
        this.DstAccessType = null;

        /**
         * Information of synced database/table objects
         * @type {Objects || null}
         */
        this.Objects = null;

        /**
         * Sync task name
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Enumerated values: `liteMode`: Lite mode; `fullMode`: Standard mode
         * @type {string || null}
         */
        this.JobMode = null;

        /**
         * Running mode. Valid values: `Immediate`, `Timed`. Default value: `Immediate`.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Expected start time in the format of "2006-01-02 15:04:05", which is required if `RunMode` is `Timed`.
         * @type {string || null}
         */
        this.ExpectRunTime = null;

        /**
         * Source database information. This parameter only applies to single-node databases, and `SrcNodeType` must be `single`.
         * @type {Endpoint || null}
         */
        this.SrcInfo = null;

        /**
         * Source database information. This parameter is valid for multi-node databases, and the value of `SrcNodeType` must be `cluster`.
         * @type {SyncDBEndpointInfos || null}
         */
        this.SrcInfos = null;

        /**
         * Enumerated values: `single` (for single-node source database), `cluster` (for multi-node source database).
         * @type {string || null}
         */
        this.SrcNodeType = null;

        /**
         * Target database information. This parameter is used by single-node databases.
         * @type {Endpoint || null}
         */
        this.DstInfo = null;

        /**
         * Target database information. This parameter is valid for multi-node databases, and the value of `DstNodeType` must be `cluster`.
         * @type {SyncDBEndpointInfos || null}
         */
        this.DstInfos = null;

        /**
         * Enumerated values: `single` (for single-node target database), `cluster` (for multi-node target database).
         * @type {string || null}
         */
        this.DstNodeType = null;

        /**
         * Sync task options. The `RateLimitOption` option cannot take effect currently. To modify the speed limit settings, use the `ModifySyncRateLimit` API.
         * @type {Options || null}
         */
        this.Options = null;

        /**
         * Automatic retry time, which can be set to 5-720 minutes. 0 indicates that retry is disabled.
         * @type {number || null}
         */
        this.AutoRetryTimeRangeMinutes = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.SrcAccessType = 'SrcAccessType' in params ? params.SrcAccessType : null;
        this.DstAccessType = 'DstAccessType' in params ? params.DstAccessType : null;

        if (params.Objects) {
            let obj = new Objects();
            obj.deserialize(params.Objects)
            this.Objects = obj;
        }
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.JobMode = 'JobMode' in params ? params.JobMode : null;
        this.RunMode = 'RunMode' in params ? params.RunMode : null;
        this.ExpectRunTime = 'ExpectRunTime' in params ? params.ExpectRunTime : null;

        if (params.SrcInfo) {
            let obj = new Endpoint();
            obj.deserialize(params.SrcInfo)
            this.SrcInfo = obj;
        }

        if (params.SrcInfos) {
            let obj = new SyncDBEndpointInfos();
            obj.deserialize(params.SrcInfos)
            this.SrcInfos = obj;
        }
        this.SrcNodeType = 'SrcNodeType' in params ? params.SrcNodeType : null;

        if (params.DstInfo) {
            let obj = new Endpoint();
            obj.deserialize(params.DstInfo)
            this.DstInfo = obj;
        }

        if (params.DstInfos) {
            let obj = new SyncDBEndpointInfos();
            obj.deserialize(params.DstInfos)
            this.DstInfos = obj;
        }
        this.DstNodeType = 'DstNodeType' in params ? params.DstNodeType : null;

        if (params.Options) {
            let obj = new Options();
            obj.deserialize(params.Options)
            this.Options = obj;
        }
        this.AutoRetryTimeRangeMinutes = 'AutoRetryTimeRangeMinutes' in params ? params.AutoRetryTimeRangeMinutes : null;

    }
}

/**
 * StartModifySyncJob response structure.
 * @class
 */
class StartModifySyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Information about each step of the subscription check task.
 * @class
 */
class SubscribeCheckStepInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Step name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepName = null;

        /**
         * Step Id
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepId = null;

        /**
         * Step number, starting from 1
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNo = null;

        /**
         * Current step status. Valid values: notStarted, running, finished, failed.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Current step progressNote: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Percent = null;

        /**
         * Error messageNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SubscribeCheckStepTip> || null}
         */
        this.Errors = null;

        /**
         * Warning messageNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SubscribeCheckStepTip> || null}
         */
        this.Warnings = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StepName = 'StepName' in params ? params.StepName : null;
        this.StepId = 'StepId' in params ? params.StepId : null;
        this.StepNo = 'StepNo' in params ? params.StepNo : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.Percent = 'Percent' in params ? params.Percent : null;

        if (params.Errors) {
            this.Errors = new Array();
            for (let z in params.Errors) {
                let obj = new SubscribeCheckStepTip();
                obj.deserialize(params.Errors[z]);
                this.Errors.push(obj);
            }
        }

        if (params.Warnings) {
            this.Warnings = new Array();
            for (let z in params.Warnings) {
                let obj = new SubscribeCheckStepTip();
                obj.deserialize(params.Warnings[z]);
                this.Warnings.push(obj);
            }
        }

    }
}

/**
 * Object in the migration task instance list
 * @class
 */
class MigrateDBItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Instance ID
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * Instance name
         * @type {string || null}
         */
        this.InstanceName = null;

        /**
         * Instance VIP
         * @type {string || null}
         */
        this.Vip = null;

        /**
         * Instance Vport
         * @type {number || null}
         */
        this.Vport = null;

        /**
         * Whether the instance can be migrated. Valid values: `1 (yes); `0` (no).
         * @type {number || null}
         */
        this.Usable = null;

        /**
         * The cause why the instance cannot be migrated
         * @type {string || null}
         */
        this.Hint = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.InstanceName = 'InstanceName' in params ? params.InstanceName : null;
        this.Vip = 'Vip' in params ? params.Vip : null;
        this.Vport = 'Vport' in params ? params.Vport : null;
        this.Usable = 'Usable' in params ? params.Usable : null;
        this.Hint = 'Hint' in params ? params.Hint : null;

    }
}

/**
 * DescribeMigrateDBInstances request structure.
 * @class
 */
class DescribeMigrateDBInstancesRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Database type, such as `mysql`.
         * @type {string || null}
         */
        this.DatabaseType = null;

        /**
         * Specifies whether the instance is the migration source or target. Valid values: `src` (source); `dts` (target).
         * @type {string || null}
         */
        this.MigrateRole = null;

        /**
         * Database instance ID
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * Database instance name
         * @type {string || null}
         */
        this.InstanceName = null;

        /**
         * Number of results to be returned
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Offset
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * The account to which the resource belongs. Valid values: empty or `self` (the current account); `other` (another account).
         * @type {string || null}
         */
        this.AccountMode = null;

        /**
         * ID of the temporary key, which is required if the operation is performed across accounts.
         * @type {string || null}
         */
        this.TmpSecretId = null;

        /**
         * Key of the temporary key, which is required if the operation is performed across accounts.
         * @type {string || null}
         */
        this.TmpSecretKey = null;

        /**
         * Temporary token, which is required if the operation is performed across accounts.
         * @type {string || null}
         */
        this.TmpToken = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DatabaseType = 'DatabaseType' in params ? params.DatabaseType : null;
        this.MigrateRole = 'MigrateRole' in params ? params.MigrateRole : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.InstanceName = 'InstanceName' in params ? params.InstanceName : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.AccountMode = 'AccountMode' in params ? params.AccountMode : null;
        this.TmpSecretId = 'TmpSecretId' in params ? params.TmpSecretId : null;
        this.TmpSecretKey = 'TmpSecretKey' in params ? params.TmpSecretKey : null;
        this.TmpToken = 'TmpToken' in params ? params.TmpToken : null;

    }
}

/**
 * Check task running details
 * @class
 */
class CheckStepInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task start time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartAt = null;

        /**
         * Task end time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EndAt = null;

        /**
         * Task step information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ProcessProgress || null}
         */
        this.Progress = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StartAt = 'StartAt' in params ? params.StartAt : null;
        this.EndAt = 'EndAt' in params ? params.EndAt : null;

        if (params.Progress) {
            let obj = new ProcessProgress();
            obj.deserialize(params.Progress)
            this.Progress = obj;
        }

    }
}

/**
 * Object of the error or warning information
 * @class
 */
class ProcessStepTip extends  AbstractModel {
    constructor(){
        super();

        /**
         * Prompt message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Solution
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Solution = null;

        /**
         * Help document
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.HelpDoc = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Message = 'Message' in params ? params.Message : null;
        this.Solution = 'Solution' in params ? params.Solution : null;
        this.HelpDoc = 'HelpDoc' in params ? params.HelpDoc : null;

    }
}

/**
 * ModifyCompareTask request structure.
 * @class
 */
class ModifyCompareTaskRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task ID in the format of `dts-8yv4w2i1-cmp-37skmii9`
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * Task name
         * @type {string || null}
         */
        this.TaskName = null;

        /**
         * Data comparison object mode. Valid values: `sameAsMigrate` (All migration objects), `custom` (Custom mode. The custom comparison objects must be a subset of the migration objects). Default value: `sameAsMigrate`.
         * @type {string || null}
         */
        this.ObjectMode = null;

        /**
         * Compared object, which is required if `CompareObjectMode` is `custom`.
         * @type {CompareObject || null}
         */
        this.Objects = null;

        /**
         * Consistency check options
         * @type {CompareOptions || null}
         */
        this.Options = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.TaskName = 'TaskName' in params ? params.TaskName : null;
        this.ObjectMode = 'ObjectMode' in params ? params.ObjectMode : null;

        if (params.Objects) {
            let obj = new CompareObject();
            obj.deserialize(params.Objects)
            this.Objects = obj;
        }

        if (params.Options) {
            let obj = new CompareOptions();
            obj.deserialize(params.Options)
            this.Options = obj;
        }

    }
}

/**
 * RecoverSyncJob request structure.
 * @class
 */
class RecoverSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task instance ID in the format of `sync-werwfs23`, which is used to identify a sync task.
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * The database/table objects to be synced
 * @class
 */
class Database extends  AbstractModel {
    constructor(){
        super();

        /**
         * Name of the database to be migrated or synced, which is required if `ObjectMode` is `Partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbName = null;

        /**
         * Name of the database after migration or sync, which is the same as the source database name by default.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewDbName = null;

        /**
         * Database selection mode, which is required if `Mode` is `Partial`. Valid values: `All`, `Partial`. Note that the sync of advanced objects does not depend on this parameter. To sync an entire database, set this parameter to `All`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbMode = null;

        /**
         * The schema to be migrated or synced
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SchemaName = null;

        /**
         * Name of the schema after migration or sync
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewSchemaName = null;

        /**
         * Table selection mode, which is required if `DBMode` is `Partial`. Valid values: `All`, `Partial`. To sync an entire database, set this parameter to `All`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableMode = null;

        /**
         * The set of table objects, which is required if `TableMode` is `Partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<Table> || null}
         */
        this.Tables = null;

        /**
         * View selection mode. Valid values: `All`, `Partial`. To sync an entire database, set this parameter to `All`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ViewMode = null;

        /**
         * The set of view objects, which is required if `ViewMode` is `Partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<View> || null}
         */
        this.Views = null;

        /**
         * Sync mode. Valid values: `All`, `Partial`. To sync an entire database, set this parameter to `All`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FunctionMode = null;

        /**
         * This parameter is required if `FunctionMode` is `Partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Functions = null;

        /**
         * Sync mode. Valid values: `All`, `Partial`. To sync an entire database, set this parameter to `All`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ProcedureMode = null;

        /**
         * This parameter is required if `ProcedureMode` is `Partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Procedures = null;

        /**
         * Trigger sync mode. Valid values: `All`, `Partial`. To sync an entire database, set this parameter to `All`. Currently, the advanced object “trigger” is not supported for data sync.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TriggerMode = null;

        /**
         * This parameter is used to specify the names of the triggers to be migrated when the value of `TriggerMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Triggers = null;

        /**
         * Event sync mode. Valid values: `All`, `Partial`. To sync an entire database, set this parameter to `All`. Currently, the advanced object “event” is not supported for data sync.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EventMode = null;

        /**
         * This parameter is used to specify the names of the events to be migrated when the value of `EventMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Events = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DbName = 'DbName' in params ? params.DbName : null;
        this.NewDbName = 'NewDbName' in params ? params.NewDbName : null;
        this.DbMode = 'DbMode' in params ? params.DbMode : null;
        this.SchemaName = 'SchemaName' in params ? params.SchemaName : null;
        this.NewSchemaName = 'NewSchemaName' in params ? params.NewSchemaName : null;
        this.TableMode = 'TableMode' in params ? params.TableMode : null;

        if (params.Tables) {
            this.Tables = new Array();
            for (let z in params.Tables) {
                let obj = new Table();
                obj.deserialize(params.Tables[z]);
                this.Tables.push(obj);
            }
        }
        this.ViewMode = 'ViewMode' in params ? params.ViewMode : null;

        if (params.Views) {
            this.Views = new Array();
            for (let z in params.Views) {
                let obj = new View();
                obj.deserialize(params.Views[z]);
                this.Views.push(obj);
            }
        }
        this.FunctionMode = 'FunctionMode' in params ? params.FunctionMode : null;
        this.Functions = 'Functions' in params ? params.Functions : null;
        this.ProcedureMode = 'ProcedureMode' in params ? params.ProcedureMode : null;
        this.Procedures = 'Procedures' in params ? params.Procedures : null;
        this.TriggerMode = 'TriggerMode' in params ? params.TriggerMode : null;
        this.Triggers = 'Triggers' in params ? params.Triggers : null;
        this.EventMode = 'EventMode' in params ? params.EventMode : null;
        this.Events = 'Events' in params ? params.Events : null;

    }
}

/**
 * Column information in data sync
 * @class
 */
class Column extends  AbstractModel {
    constructor(){
        super();

        /**
         * Column nameNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ColumnName = null;

        /**
         * New column name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewColumnName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ColumnName = 'ColumnName' in params ? params.ColumnName : null;
        this.NewColumnName = 'NewColumnName' in params ? params.NewColumnName : null;

    }
}

/**
 * Migration task list
 * @class
 */
class JobItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data migration task name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Task creation (submission) time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CreateTime = null;

        /**
         * Task update time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UpdateTime = null;

        /**
         * Task start time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartTime = null;

        /**
         * Task end time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EndTime = null;

        /**
         * Migration task error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.BriefMsg = null;

        /**
         * Task status. Valid values: `creating` (Creating), `created`(Created), `checking` (Checking), `checkPass` (Check passed), `checkNotPass` (Check not passed), `readyRun` (Ready for running), `running` (Running), `readyComplete` (Preparation completed), `success` (Successful), `failed` (Failed), `stopping` (Stopping), `completing` (Completing), `pausing` (Pausing), `manualPaused` (Paused). Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Task running mode. Valid values: `immediate`, `timed`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Expected start time in the format of "2022-07-11 16:20:49", which is required if `RunMode` is `timed`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpectRunTime = null;

        /**
         * Task operation information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {MigrateAction || null}
         */
        this.Action = null;

        /**
         * Information of the migration task execution process
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {MigrateDetailInfo || null}
         */
        this.StepInfo = null;

        /**
         * Source instance information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {DBEndpointInfo || null}
         */
        this.SrcInfo = null;

        /**
         * Target database information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {DBEndpointInfo || null}
         */
        this.DstInfo = null;

        /**
         * Data consistency check result
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareTaskInfo || null}
         */
        this.CompareTask = null;

        /**
         * Billing status information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {TradeInfo || null}
         */
        this.TradeInfo = null;

        /**
         * Tag information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Information of automatic retry time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.AutoRetryTimeRangeMinutes = null;

        /**
         * Whether the task can be reentered in the full export stage. Valid values: `yes`, `no`. `yes`: The current task can be reentered. `no`: The current task is in the full export stage which cannot be reentered. If the value of this parameter is `no`, the checkpoint restart is not supported when the task is restarted in the export stage.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DumperResumeCtrl = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.UpdateTime = 'UpdateTime' in params ? params.UpdateTime : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;
        this.BriefMsg = 'BriefMsg' in params ? params.BriefMsg : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.RunMode = 'RunMode' in params ? params.RunMode : null;
        this.ExpectRunTime = 'ExpectRunTime' in params ? params.ExpectRunTime : null;

        if (params.Action) {
            let obj = new MigrateAction();
            obj.deserialize(params.Action)
            this.Action = obj;
        }

        if (params.StepInfo) {
            let obj = new MigrateDetailInfo();
            obj.deserialize(params.StepInfo)
            this.StepInfo = obj;
        }

        if (params.SrcInfo) {
            let obj = new DBEndpointInfo();
            obj.deserialize(params.SrcInfo)
            this.SrcInfo = obj;
        }

        if (params.DstInfo) {
            let obj = new DBEndpointInfo();
            obj.deserialize(params.DstInfo)
            this.DstInfo = obj;
        }

        if (params.CompareTask) {
            let obj = new CompareTaskInfo();
            obj.deserialize(params.CompareTask)
            this.CompareTask = obj;
        }

        if (params.TradeInfo) {
            let obj = new TradeInfo();
            obj.deserialize(params.TradeInfo)
            this.TradeInfo = obj;
        }

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }
        this.AutoRetryTimeRangeMinutes = 'AutoRetryTimeRangeMinutes' in params ? params.AutoRetryTimeRangeMinutes : null;
        this.DumperResumeCtrl = 'DumperResumeCtrl' in params ? params.DumperResumeCtrl : null;

    }
}

/**
 * DestroyIsolatedSubscribe response structure.
 * @class
 */
class DestroyIsolatedSubscribeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * The object of the data subscription is used in the ModifySubscribeObjects interface. Similar to the SubscribeObject structure, only the type and parameter names differ.
 * @class
 */
class ModifiedSubscribeObject extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription object type. Valid values: 0 (database); 1 (table, for mongo tasks, this corresponds to a collection).Note: mongo only supports full instance, single database or single collection subscription, so this field should not conflict with SubscribeObjectType. For example, when SubscribeObjectType=4, it means mongo single database subscription, then 0 should be passed in this field.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.ObjectsType = null;

        /**
         * Subscription database nameNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseName = null;

        /**
         * Name of the table (or collection) in the subscription database. If ObjectsType is 1, this field is required and not empty; 
         * @type {Array.<string> || null}
         */
        this.TableNames = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ObjectsType = 'ObjectsType' in params ? params.ObjectsType : null;
        this.DatabaseName = 'DatabaseName' in params ? params.DatabaseName : null;
        this.TableNames = 'TableNames' in params ? params.TableNames : null;

    }
}

/**
 * DescribeCompareTasks response structure.
 * @class
 */
class DescribeCompareTasksResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Quantity
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * List of data consistency check tasks
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<CompareTaskItem> || null}
         */
        this.Items = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.Items) {
            this.Items = new Array();
            for (let z in params.Items) {
                let obj = new CompareTaskItem();
                obj.deserialize(params.Items[z]);
                this.Items.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ResumeSubscribe response structure.
 * @class
 */
class ResumeSubscribeResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeSyncJobs request structure.
 * @class
 */
class DescribeSyncJobsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID, such as `sync-werwfs23`.
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Sync task name
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Sort by field, such as `CreateTime`.
         * @type {string || null}
         */
        this.Order = null;

        /**
         * Sorting order. Valid values: `ASC`, `DESC`. Default value: `DESC` by `CreateTime`.
         * @type {string || null}
         */
        this.OrderSeq = null;

        /**
         * Offset. Default value: `0`.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of sync task instances to be returned. Value range: [1,100]. Default value: `20`.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * The set of status values, such as `Initialized,CheckPass,Running,ResumableErr,Stopped`.
         * @type {Array.<string> || null}
         */
        this.Status = null;

        /**
         * Running mode. Valid values: `Immediate`, `Timed`.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Task type, such as `mysql2mysql` (sync from MySQL to MySQL).
         * @type {string || null}
         */
        this.JobType = null;

        /**
         * Billing mode. Valid values: `PrePay` (prepaid); `PostPay` (postpaid).
         * @type {string || null}
         */
        this.PayMode = null;

        /**
         * tag
         * @type {Array.<TagFilter> || null}
         */
        this.TagFilters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.Order = 'Order' in params ? params.Order : null;
        this.OrderSeq = 'OrderSeq' in params ? params.OrderSeq : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.RunMode = 'RunMode' in params ? params.RunMode : null;
        this.JobType = 'JobType' in params ? params.JobType : null;
        this.PayMode = 'PayMode' in params ? params.PayMode : null;

        if (params.TagFilters) {
            this.TagFilters = new Array();
            for (let z in params.TagFilters) {
                let obj = new TagFilter();
                obj.deserialize(params.TagFilters[z]);
                this.TagFilters.push(obj);
            }
        }

    }
}

/**
 * Step information of the sync task
 * @class
 */
class SyncDetailInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of steps
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepAll = null;

        /**
         * Current step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNow = null;

        /**
         * Overall progress
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Progress = null;

        /**
         * Progress of the current step. Value range: 0-100. The value of `-1` indicates that you can't check the progress of the current step.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CurrentStepProgress = null;

        /**
         * Data volume difference between the sync source and target
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.MasterSlaveDistance = null;

        /**
         * Time difference between the sync source and target
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.SecondsBehindMaster = null;

        /**
         * Overall description
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Step details
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepInfo> || null}
         */
        this.StepInfos = null;

        /**
         * Cause of the failure of initiating data consistency check
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CauseOfCompareDisable = null;

        /**
         * Task error and the corresponding solution
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ErrInfo || null}
         */
        this.ErrInfo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StepAll = 'StepAll' in params ? params.StepAll : null;
        this.StepNow = 'StepNow' in params ? params.StepNow : null;
        this.Progress = 'Progress' in params ? params.Progress : null;
        this.CurrentStepProgress = 'CurrentStepProgress' in params ? params.CurrentStepProgress : null;
        this.MasterSlaveDistance = 'MasterSlaveDistance' in params ? params.MasterSlaveDistance : null;
        this.SecondsBehindMaster = 'SecondsBehindMaster' in params ? params.SecondsBehindMaster : null;
        this.Message = 'Message' in params ? params.Message : null;

        if (params.StepInfos) {
            this.StepInfos = new Array();
            for (let z in params.StepInfos) {
                let obj = new StepInfo();
                obj.deserialize(params.StepInfos[z]);
                this.StepInfos.push(obj);
            }
        }
        this.CauseOfCompareDisable = 'CauseOfCompareDisable' in params ? params.CauseOfCompareDisable : null;

        if (params.ErrInfo) {
            let obj = new ErrInfo();
            obj.deserialize(params.ErrInfo)
            this.ErrInfo = obj;
        }

    }
}

/**
 * DescribeConsumerGroups response structure.
 * @class
 */
class DescribeConsumerGroupsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of consumer groups under the specific instance
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Consumer group list
         * @type {Array.<GroupInfo> || null}
         */
        this.Items = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.Items) {
            this.Items = new Array();
            for (let z in params.Items) {
                let obj = new GroupInfo();
                obj.deserialize(params.Items[z]);
                this.Items.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyMigrateRateLimit request structure.
 * @class
 */
class ModifyMigrateRateLimitRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Number of full export threads for migration task. Value range: 1-16.
         * @type {number || null}
         */
        this.DumpThread = null;

        /**
         * The full export Rps for migration task. The value needs to be greater than 0.
         * @type {number || null}
         */
        this.DumpRps = null;

        /**
         * Number of full import threads for migration task. Value range: 1-16.
         * @type {number || null}
         */
        this.LoadThread = null;

        /**
         * Number of incremental import threads for migration task. Value range: 1-128.
         * @type {number || null}
         */
        this.SinkerThread = null;

        /**
         * Limits for full import Rps.
         * @type {number || null}
         */
        this.LoadRps = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.DumpThread = 'DumpThread' in params ? params.DumpThread : null;
        this.DumpRps = 'DumpRps' in params ? params.DumpRps : null;
        this.LoadThread = 'LoadThread' in params ? params.LoadThread : null;
        this.SinkerThread = 'SinkerThread' in params ? params.SinkerThread : null;
        this.LoadRps = 'LoadRps' in params ? params.LoadRps : null;

    }
}

/**
 * Table configuration for data consistency check
 * @class
 */
class CompareTableItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Table name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableName = null;

        /**
         * In column mode, all refers to all data, while partial refers to part of the data (this parameter is only valid for data sync tasks).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ColumnMode = null;

        /**
         * This field is required when ColumnMode is set to partial (this parameter is only valid for data sync tasks).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<CompareColumnItem> || null}
         */
        this.Columns = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TableName = 'TableName' in params ? params.TableName : null;
        this.ColumnMode = 'ColumnMode' in params ? params.ColumnMode : null;

        if (params.Columns) {
            this.Columns = new Array();
            for (let z in params.Columns) {
                let obj = new CompareColumnItem();
                obj.deserialize(params.Columns[z]);
                this.Columns.push(obj);
            }
        }

    }
}

/**
 * ConfigureSyncJob response structure.
 * @class
 */
class ConfigureSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * View configuration for data consistency check
 * @class
 */
class CompareViewItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * View name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ViewName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ViewName = 'ViewName' in params ? params.ViewName : null;

    }
}

/**
 * Step details
 * @class
 */
class StepInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Step number
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNo = null;

        /**
         * Step name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepName = null;

        /**
         * Step ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepId = null;

        /**
         * Status of the current step. Valid values: `notStarted`, `running`, `failed`, `finished, `skipped`, `paused`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Step start time, which may be null.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartTime = null;

        /**
         * Error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepTip> || null}
         */
        this.Errors = null;

        /**
         * Warning message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepTip> || null}
         */
        this.Warnings = null;

        /**
         * Current step progress. Value range: 0-100. The value `-1` indicates that the progress of the current step is unavailable. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Progress = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StepNo = 'StepNo' in params ? params.StepNo : null;
        this.StepName = 'StepName' in params ? params.StepName : null;
        this.StepId = 'StepId' in params ? params.StepId : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;

        if (params.Errors) {
            this.Errors = new Array();
            for (let z in params.Errors) {
                let obj = new StepTip();
                obj.deserialize(params.Errors[z]);
                this.Errors.push(obj);
            }
        }

        if (params.Warnings) {
            this.Warnings = new Array();
            for (let z in params.Warnings) {
                let obj = new StepTip();
                obj.deserialize(params.Warnings[z]);
                this.Warnings.push(obj);
            }
        }
        this.Progress = 'Progress' in params ? params.Progress : null;

    }
}

/**
 * Subscription database and table information, used to configure and query the subscription task interfaces.
 * @class
 */
class SubscribeObject extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription data type. Valid values: database; table (if DatabaseType is mongodb, it means a collection).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ObjectType = null;

        /**
         * Subscribed database name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Database = null;

        /**
         * Name of the table in the subscribed database. If DatabaseType is mongodb, fill in the collection name. MongoDB only supports subscribing to a single database or a single collection.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Tables = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ObjectType = 'ObjectType' in params ? params.ObjectType : null;
        this.Database = 'Database' in params ? params.Database : null;
        this.Tables = 'Tables' in params ? params.Tables : null;

    }
}

/**
 * ResumeMigrateJob request structure.
 * @class
 */
class ResumeMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Task resumption mode. Valid values: `clearData` (Clearing the target instance data); `overwrite` (Executing the task in overwrite mode); `normal` (Following the normal process without additional operations). `clearData` and `overwrite` are only valid for Redis links and `normal` for non-Redis links.
         * @type {string || null}
         */
        this.ResumeOption = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.ResumeOption = 'ResumeOption' in params ? params.ResumeOption : null;

    }
}

/**
 * PauseSyncJob response structure.
 * @class
 */
class PauseSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeSubscribeCheckJob request structure.
 * @class
 */
class DescribeSubscribeCheckJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * ModifySubscribeObjects request structure.
 * @class
 */
class ModifySubscribeObjectsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Data subscription type. Valid values for non-mongo task: 0 (full instance update); 1 (data update); 2 (structure update); 3 (data + structure update). Valid values for mongo task: 0 (full instance update); 4 (subscribe to a table); 5 (subscribe to a collection).
         * @type {number || null}
         */
        this.SubscribeObjectType = null;

        /**
         * Modified subscription database table information. It will replace the original subscription object, this field is required unless SubscribeObjectType = 0 or 2.
         * @type {Array.<ModifiedSubscribeObject> || null}
         */
        this.Objects = null;

        /**
         * Kafka partitioning policy. If left blank, it will remain unchanged by default. If filled, it will replace the original policy.
         * @type {Array.<DistributeRule> || null}
         */
        this.DistributeRules = null;

        /**
         * Default partitioning policy. Data that does not meet the regex in DistributeRules will be partitioned according to the default partitioning policy.Default strategies supported by non-mongo products: table - partitioned by table name, pk - partitioned by table name + primary key. Mongo's default strategy only supports: collection-partitioned by collection name.This field is used in conjunction with DistributeRules. If DistributeRules is configured, this field is also required. If this field is configured, it is considered as configuring a DistributeRules, and the original partitioning policy will also be overwritten.
         * @type {string || null}
         */
        this.DefaultRuleType = null;

        /**
         * Mongo output aggregation settings, optional for Mongo tasks. If left blank, no modification will be made by default.
         * @type {Array.<PipelineInfo> || null}
         */
        this.PipelineInfo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.SubscribeObjectType = 'SubscribeObjectType' in params ? params.SubscribeObjectType : null;

        if (params.Objects) {
            this.Objects = new Array();
            for (let z in params.Objects) {
                let obj = new ModifiedSubscribeObject();
                obj.deserialize(params.Objects[z]);
                this.Objects.push(obj);
            }
        }

        if (params.DistributeRules) {
            this.DistributeRules = new Array();
            for (let z in params.DistributeRules) {
                let obj = new DistributeRule();
                obj.deserialize(params.DistributeRules[z]);
                this.DistributeRules.push(obj);
            }
        }
        this.DefaultRuleType = 'DefaultRuleType' in params ? params.DefaultRuleType : null;

        if (params.PipelineInfo) {
            this.PipelineInfo = new Array();
            for (let z in params.PipelineInfo) {
                let obj = new PipelineInfo();
                obj.deserialize(params.PipelineInfo[z]);
                this.PipelineInfo.push(obj);
            }
        }

    }
}

/**
 * Synced view description
 * @class
 */
class View extends  AbstractModel {
    constructor(){
        super();

        /**
         * View name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ViewName = null;

        /**
         * Reserved field. Currently, a view cannot be renamed. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewViewName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ViewName = 'ViewName' in params ? params.ViewName : null;
        this.NewViewName = 'NewViewName' in params ? params.NewViewName : null;

    }
}

/**
 * Partition details of Kafka consumer group
 * @class
 */
class MonitorInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * The number of the current partition, starting from 0.
         * @type {number || null}
         */
        this.PartitionNo = null;

        /**
         * The offset of the current partition.
         * @type {number || null}
         */
        this.ConsumerGroupOffset = null;

        /**
         * The amount of unconsumed data in the current partition.
         * @type {number || null}
         */
        this.ConsumerGroupLag = null;

        /**
         * The consumption delay of the current partition (in seconds).
         * @type {number || null}
         */
        this.Latency = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.PartitionNo = 'PartitionNo' in params ? params.PartitionNo : null;
        this.ConsumerGroupOffset = 'ConsumerGroupOffset' in params ? params.ConsumerGroupOffset : null;
        this.ConsumerGroupLag = 'ConsumerGroupLag' in params ? params.ConsumerGroupLag : null;
        this.Latency = 'Latency' in params ? params.Latency : null;

    }
}

/**
 * DescribeOffsetByTime request structure.
 * @class
 */
class DescribeOffsetByTimeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Timestamp, the format is: Y-m-d h:m:s. If the input time is much later than the current time, this is equivalent to the latest offset; if the input time is much earlier than the current time, this is equivalent to the oldest offset; if the input is empty, the default time is 0, which is the oldest offset to be queried.
         * @type {string || null}
         */
        this.Time = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.Time = 'Time' in params ? params.Time : null;

    }
}

/**
 * StartCompare response structure.
 * @class
 */
class StartCompareResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Data sync options
 * @class
 */
class DynamicOptions extends  AbstractModel {
    constructor(){
        super();

        /**
         * DML and DDL options to be synced. Valid values: `Insert` (INSERT), `Update` (UPDATE), `Delete` (DELETE), `DDL` (structure sync), `PartialDDL` (custom option, which is used together with `DdlOptions`). This parameter is required, and its value will overwrite the previous value. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.OpTypes = null;

        /**
         * DDL options to be synced. This parameter is required when `OpTypes` is `PartialDDL`, and its value will overwrite the previous value. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DdlOption> || null}
         */
        this.DdlOptions = null;

        /**
         * Conflict resolution method. Valid values: `ReportError` (Report error), `Ignore` (Ignore), `Cover` (Overwrite), `ConditionCover` (Conditionally overwrite). Currently, this parameter cannot be modified if the target of the link is Kafka. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ConflictHandleType = null;

        /**
         * Detailed options of the conflict resolution method, such as the conditionally overwritten rows and condition operations for the “conditionally overwrite” method. The internal field of this parameter cannot be modified separately. If this parameter needs to be updated, update it fully. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ConflictHandleOption || null}
         */
        this.ConflictHandleOption = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.OpTypes = 'OpTypes' in params ? params.OpTypes : null;

        if (params.DdlOptions) {
            this.DdlOptions = new Array();
            for (let z in params.DdlOptions) {
                let obj = new DdlOption();
                obj.deserialize(params.DdlOptions[z]);
                this.DdlOptions.push(obj);
            }
        }
        this.ConflictHandleType = 'ConflictHandleType' in params ? params.ConflictHandleType : null;

        if (params.ConflictHandleOption) {
            let obj = new ConflictHandleOption();
            obj.deserialize(params.ConflictHandleOption)
            this.ConflictHandleOption = obj;
        }

    }
}

/**
 * CreateCompareTask response structure.
 * @class
 */
class CreateCompareTaskResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data consistency check task ID in the format of `dts-8yv4w2i1-cmp-37skmii9`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Speed limit details of migration and sync tasks
 * @class
 */
class RateLimitOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * The number of full export threads currently in effect. The value of this field can be adjusted when configuring the task. Note: If it is not set or set to 0, it means the current value is maintained. The maximum value is 16.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CurrentDumpThread = null;

        /**
         * The default number of full export threads. This field is only meaningful in the output parameter.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DefaultDumpThread = null;

        /**
         * The full export Rps currently in effect. The value of this field can be adjusted when configuring the task. Note: If it is not set or set to 0, it means the current value is maintained. The maximum value is 50,000,000.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CurrentDumpRps = null;

        /**
         * The default full export Rps. This field is only meaningful in the output parameter.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DefaultDumpRps = null;

        /**
         * The number of full import threads currently in effect. The value of this field can be adjusted when configuring the task. Note: If it is not set or set to 0, it means the current value is maintained. The maximum value is 16.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CurrentLoadThread = null;

        /**
         * The default number of full import threads. This field is only meaningful in the output parameter.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DefaultLoadThread = null;

        /**
         * The full import Rps currently in effect. The value of this field can be adjusted when configuring the task. Note: If it is not set or set to 0, it means the current value is maintained. The maximum value is 50,000,000.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CurrentLoadRps = null;

        /**
         * The default full import Rps. This field is only meaningful in the output parameter.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DefaultLoadRps = null;

        /**
         * The number of incremental import threads currently in effect. The value of this field can be adjusted when configuring the task. Note: If it is not set or set to 0, it means the current value is maintained. The maximum value is 128.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CurrentSinkerThread = null;

        /**
         * The default number of incremental import threads. This field is only meaningful in the output parameter.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DefaultSinkerThread = null;

        /**
         * enum:"no"/"yes", no: the user has not set a speed limit; yes: a speed limit has been set. This field is only meaningful in the output parameter.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.HasUserSetRateLimit = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.CurrentDumpThread = 'CurrentDumpThread' in params ? params.CurrentDumpThread : null;
        this.DefaultDumpThread = 'DefaultDumpThread' in params ? params.DefaultDumpThread : null;
        this.CurrentDumpRps = 'CurrentDumpRps' in params ? params.CurrentDumpRps : null;
        this.DefaultDumpRps = 'DefaultDumpRps' in params ? params.DefaultDumpRps : null;
        this.CurrentLoadThread = 'CurrentLoadThread' in params ? params.CurrentLoadThread : null;
        this.DefaultLoadThread = 'DefaultLoadThread' in params ? params.DefaultLoadThread : null;
        this.CurrentLoadRps = 'CurrentLoadRps' in params ? params.CurrentLoadRps : null;
        this.DefaultLoadRps = 'DefaultLoadRps' in params ? params.DefaultLoadRps : null;
        this.CurrentSinkerThread = 'CurrentSinkerThread' in params ? params.CurrentSinkerThread : null;
        this.DefaultSinkerThread = 'DefaultSinkerThread' in params ? params.DefaultSinkerThread : null;
        this.HasUserSetRateLimit = 'HasUserSetRateLimit' in params ? params.HasUserSetRateLimit : null;

    }
}

/**
 * SkipCheckItem request structure.
 * @class
 */
class SkipCheckItemRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * ID of the check step to be skipped, which is obtained in the `StepInfo[i].StepId` field returned by the `DescribeMigrationCheckJob` API, such as "OptimizeCheck".
         * @type {Array.<string> || null}
         */
        this.StepIds = null;

        /**
         * When the check fails due to foreign key dependency, you can use this field to specify whether to migrate the foreign key dependency. The foreign key dependency won’t be migrated when `StepIds` contains `ConstraintCheck` and the value of this field is `shield`, and will be migrated when `StepIds` contains `ConstraintCheck` and the value of this field is `migrate`.
         * @type {string || null}
         */
        this.ForeignKeyFlag = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.StepIds = 'StepIds' in params ? params.StepIds : null;
        this.ForeignKeyFlag = 'ForeignKeyFlag' in params ? params.ForeignKeyFlag : null;

    }
}

/**
 * Summary information of data consistency check
 * @class
 */
class CompareAbstractInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Configuration parameters of the check task
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareOptions || null}
         */
        this.Options = null;

        /**
         * Consistency check objects
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareObject || null}
         */
        this.Objects = null;

        /**
         * Comparison conclusion. Valid values: `same`, `different`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Conclusion = null;

        /**
         * Task status. Valid values: `success`, `failed`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Total number of tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.TotalTables = null;

        /**
         * Number of checked tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.CheckedTables = null;

        /**
         * Number of inconsistent tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DifferentTables = null;

        /**
         * Number of skipped tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.SkippedTables = null;

        /**
         * The estimated number of tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.NearlyTableCount = null;

        /**
         * Number of inconsistent data rows
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DifferentRows = null;

        /**
         * Source database row count, which takes effect only when the comparison type is **Row count comparison**.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.SrcSampleRows = null;

        /**
         * Target database row count, which takes effect only when the comparison type is **Row count comparison**.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.DstSampleRows = null;

        /**
         * Start time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartedAt = null;

        /**
         * End time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FinishedAt = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Options) {
            let obj = new CompareOptions();
            obj.deserialize(params.Options)
            this.Options = obj;
        }

        if (params.Objects) {
            let obj = new CompareObject();
            obj.deserialize(params.Objects)
            this.Objects = obj;
        }
        this.Conclusion = 'Conclusion' in params ? params.Conclusion : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.TotalTables = 'TotalTables' in params ? params.TotalTables : null;
        this.CheckedTables = 'CheckedTables' in params ? params.CheckedTables : null;
        this.DifferentTables = 'DifferentTables' in params ? params.DifferentTables : null;
        this.SkippedTables = 'SkippedTables' in params ? params.SkippedTables : null;
        this.NearlyTableCount = 'NearlyTableCount' in params ? params.NearlyTableCount : null;
        this.DifferentRows = 'DifferentRows' in params ? params.DifferentRows : null;
        this.SrcSampleRows = 'SrcSampleRows' in params ? params.SrcSampleRows : null;
        this.DstSampleRows = 'DstSampleRows' in params ? params.DstSampleRows : null;
        this.StartedAt = 'StartedAt' in params ? params.StartedAt : null;
        this.FinishedAt = 'FinishedAt' in params ? params.FinishedAt : null;

    }
}

/**
 * Check step
 * @class
 */
class CheckStep extends  AbstractModel {
    constructor(){
        super();

        /**
         * Step number
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNo = null;

        /**
         * Step ID such as `ConnectDBCheck`, `VersionCheck`, and `SrcPrivilegeCheck`. The specific check items are subject to source and target instances.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepId = null;

        /**
         * Step name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepName = null;

        /**
         * Result of this check step. Valid values: `pass`, `failed`, `notStarted`, `blocked`, `warning`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepStatus = null;

        /**
         * Error message in this check step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepMessage = null;

        /**
         * Specific check item in this check step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DetailCheckItem> || null}
         */
        this.DetailCheckItems = null;

        /**
         * Whether this step was skipped
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {boolean || null}
         */
        this.HasSkipped = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StepNo = 'StepNo' in params ? params.StepNo : null;
        this.StepId = 'StepId' in params ? params.StepId : null;
        this.StepName = 'StepName' in params ? params.StepName : null;
        this.StepStatus = 'StepStatus' in params ? params.StepStatus : null;
        this.StepMessage = 'StepMessage' in params ? params.StepMessage : null;

        if (params.DetailCheckItems) {
            this.DetailCheckItems = new Array();
            for (let z in params.DetailCheckItems) {
                let obj = new DetailCheckItem();
                obj.deserialize(params.DetailCheckItems[z]);
                this.DetailCheckItems.push(obj);
            }
        }
        this.HasSkipped = 'HasSkipped' in params ? params.HasSkipped : null;

    }
}

/**
 * Information of the data consistency check object
 * @class
 */
class CompareTaskItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * Data consistency check task name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TaskName = null;

        /**
         * Data consistency check task status. Valid values: `created`, `readyRun`, `running`, `success`, `stopping`, `failed`, `canceled`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Data consistency check task configuration
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareObject || null}
         */
        this.Config = null;

        /**
         * Check details of the data consistency check task
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ProcessProgress || null}
         */
        this.CheckProcess = null;

        /**
         * Running details of the data consistency check task
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {ProcessProgress || null}
         */
        this.CompareProcess = null;

        /**
         * Comparison result. Valid values: `same`, `different`, `skipAll`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Conclusion = null;

        /**
         * Task creation time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CreatedAt = null;

        /**
         * Task start time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartedAt = null;

        /**
         * Comparison end time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FinishedAt = null;

        /**
         * Comparison type: (`dataCheck`: Full data comparison; `sampleDataCheck`: Sampling data comparison; `rowsCount`: Row count comparison)
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Method = null;

        /**
         * Configuration information of the comparison task
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareOptions || null}
         */
        this.Options = null;

        /**
         * Consistency check prompt message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.TaskName = 'TaskName' in params ? params.TaskName : null;
        this.Status = 'Status' in params ? params.Status : null;

        if (params.Config) {
            let obj = new CompareObject();
            obj.deserialize(params.Config)
            this.Config = obj;
        }

        if (params.CheckProcess) {
            let obj = new ProcessProgress();
            obj.deserialize(params.CheckProcess)
            this.CheckProcess = obj;
        }

        if (params.CompareProcess) {
            let obj = new ProcessProgress();
            obj.deserialize(params.CompareProcess)
            this.CompareProcess = obj;
        }
        this.Conclusion = 'Conclusion' in params ? params.Conclusion : null;
        this.CreatedAt = 'CreatedAt' in params ? params.CreatedAt : null;
        this.StartedAt = 'StartedAt' in params ? params.StartedAt : null;
        this.FinishedAt = 'FinishedAt' in params ? params.FinishedAt : null;
        this.Method = 'Method' in params ? params.Method : null;

        if (params.Options) {
            let obj = new CompareOptions();
            obj.deserialize(params.Options)
            this.Options = obj;
        }
        this.Message = 'Message' in params ? params.Message : null;

    }
}

/**
 * ModifyMigrateJobSpec response structure.
 * @class
 */
class ModifyMigrateJobSpecResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateSyncJob response structure.
 * @class
 */
class CreateSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task IDs
         * @type {Array.<string> || null}
         */
        this.JobIds = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobIds = 'JobIds' in params ? params.JobIds : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateCompareTask request structure.
 * @class
 */
class CreateCompareTaskRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task name. If this parameter is left empty, the value of `CompareTaskId` will be assigned to it.
         * @type {string || null}
         */
        this.TaskName = null;

        /**
         * Data comparison object mode. Valid values: `sameAsMigrate` (all migration objects); `custom` (custom mode). Default value: `sameAsMigrate`.
         * @type {string || null}
         */
        this.ObjectMode = null;

        /**
         * Configuration of the data consistency check object
         * @type {CompareObject || null}
         */
        this.Objects = null;

        /**
         * Consistency check options
         * @type {CompareOptions || null}
         */
        this.Options = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.TaskName = 'TaskName' in params ? params.TaskName : null;
        this.ObjectMode = 'ObjectMode' in params ? params.ObjectMode : null;

        if (params.Objects) {
            let obj = new CompareObject();
            obj.deserialize(params.Objects)
            this.Objects = obj;
        }

        if (params.Options) {
            let obj = new CompareOptions();
            obj.deserialize(params.Options)
            this.Options = obj;
        }

    }
}

/**
 * Error information and the corresponding solution
 * @class
 */
class ErrInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Cause of the error
         * @type {string || null}
         */
        this.Reason = null;

        /**
         * Error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Solution
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Solution = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Reason = 'Reason' in params ? params.Reason : null;
        this.Message = 'Message' in params ? params.Message : null;
        this.Solution = 'Solution' in params ? params.Solution : null;

    }
}

/**
 * StartCompare request structure.
 * @class
 */
class StartCompareRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task ID in the format of `dts-8yv4w2i1-cmp-37skmii9`
         * @type {string || null}
         */
        this.CompareTaskId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;

    }
}

/**
 * Instance node information of data subscription
 * @class
 */
class EndpointItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Region of the source database. If AccessType is ccn, please fill in the region where vpc is located because the region of the source database is unknown. For other access methods, please fill in the region where the subscription task is located, as ensuring the subscription task and the source database are in the same region is the optimal network solution.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseRegion = null;

        /**
         * UsernameNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.User = null;

        /**
         * Password. It is required when used as an input parameter and empty when used as an output parameter.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Password = null;

        /**
         * Target instance ID. This field is required when AccessType is cdb. When configuring the InstanceId, the instance information is queried and checked. The mysql query interface has been authenticated. Please ensure that the sub-user has the cdb:DescribeDBInstances interface permission.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * Cloud Virtual Machine ID. This field is required when AccessType is cvm.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CvmInstanceId = null;

        /**
         * Direct Connect gateway ID. This field is required when AccessType is dcg.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UniqDcgId = null;

        /**
         * Cloud Connect Network ID. This field is required when AccessType is ccn.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CcnId = null;

        /**
         * VPN gateway ID. This field is required when AccessType is vpncloud.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UniqVpnGwId = null;

        /**
         * VpcID. This field is required when AccessType is dcg\ccn\vpncloud\vpc.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * Subnet ID. This field is required when AccessType is dcg\ccn\vpncloud\vpc.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SubnetId = null;

        /**
         * Database address, supports domain name and IP. This field is required when AccessType is dcg\ccn\vpncloud\vpc\extranet\intranet.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.HostName = null;

        /**
         * Database port. This field is required when AccessType is dcg\ccn\vpncloud\vpc\extranet\intranet\cvm.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Port = null;

        /**
         * Whether to use encrypted transmission. Valid values: UnEncrypted; Encrypted. Only mysql supports it. If it is not filled in, it will not be encrypted by default. Other products do not need to fill in this.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EncryptConn = null;

        /**
         * Database network environment. This field is required when AccessType is ccn. Valid values: UserIDC; TencentVPC; Aws; AliYun; Others.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseNetEnv = null;

        /**
         * The UIN of the main account to which the Cloud Connect Network gateway belongs. It is required for cross-account CCN.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CcnOwnerUin = null;

        /**
         * Additional information added for the business. Parameter name is called key, parameter value is called value. Mandatory parameters for tdpg: PgDatabase (subscribed database name).Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<KeyValuePairOption> || null}
         */
        this.ExtraAttr = null;

        /**
         * 
         * @type {string || null}
         */
        this.ChildInstanceId = null;

        /**
         * 
         * @type {string || null}
         */
        this.ChildInstanceType = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DatabaseRegion = 'DatabaseRegion' in params ? params.DatabaseRegion : null;
        this.User = 'User' in params ? params.User : null;
        this.Password = 'Password' in params ? params.Password : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.CvmInstanceId = 'CvmInstanceId' in params ? params.CvmInstanceId : null;
        this.UniqDcgId = 'UniqDcgId' in params ? params.UniqDcgId : null;
        this.CcnId = 'CcnId' in params ? params.CcnId : null;
        this.UniqVpnGwId = 'UniqVpnGwId' in params ? params.UniqVpnGwId : null;
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.SubnetId = 'SubnetId' in params ? params.SubnetId : null;
        this.HostName = 'HostName' in params ? params.HostName : null;
        this.Port = 'Port' in params ? params.Port : null;
        this.EncryptConn = 'EncryptConn' in params ? params.EncryptConn : null;
        this.DatabaseNetEnv = 'DatabaseNetEnv' in params ? params.DatabaseNetEnv : null;
        this.CcnOwnerUin = 'CcnOwnerUin' in params ? params.CcnOwnerUin : null;

        if (params.ExtraAttr) {
            this.ExtraAttr = new Array();
            for (let z in params.ExtraAttr) {
                let obj = new KeyValuePairOption();
                obj.deserialize(params.ExtraAttr[z]);
                this.ExtraAttr.push(obj);
            }
        }
        this.ChildInstanceId = 'ChildInstanceId' in params ? params.ChildInstanceId : null;
        this.ChildInstanceType = 'ChildInstanceType' in params ? params.ChildInstanceType : null;

    }
}

/**
 * DescribeMigrationCheckJob request structure.
 * @class
 */
class DescribeMigrationCheckJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * DescribeMigrationDetail response structure.
 * @class
 */
class DescribeMigrationDetailResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data migration task name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Task creation (submission) time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CreateTime = null;

        /**
         * Task update time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UpdateTime = null;

        /**
         * Task start time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartTime = null;

        /**
         * Task end time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EndTime = null;

        /**
         * Migration task error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.BriefMsg = null;

        /**
         * Task status. Valid values: `created`(Created), `checking` (Checking), `checkPass` (Check passed), `checkNotPass` (Check not passed), `readyRun` (Ready for running), `running` (Running), `readyComplete` (Preparation completed), `success` (Successful), `failed` (Failed), `stopping` (Stopping), `completing` (Completing), `pausing` (Pausing), `manualPaused` (Paused). Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Task operation information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {MigrateAction || null}
         */
        this.Action = null;

        /**
         * Information of the migration task execution process. The check and migration step information will be displayed in the check and migration stages respectively.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {MigrateDetailInfo || null}
         */
        this.StepInfo = null;

        /**
         * Source instance information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {DBEndpointInfo || null}
         */
        this.SrcInfo = null;

        /**
         * Target database information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {DBEndpointInfo || null}
         */
        this.DstInfo = null;

        /**
         * Data consistency check result
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CompareTaskInfo || null}
         */
        this.CompareTask = null;

        /**
         * Tag information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Running mode. Valid values: `immediate`, `timed`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Expected start time in the format of "2006-01-02 15:04:05", which is required if `RunMode` is `timed`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpectRunTime = null;

        /**
         * Migration options, which describe how the task performs migration.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {MigrateOption || null}
         */
        this.MigrateOption = null;

        /**
         * Check task running details
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {CheckStepInfo || null}
         */
        this.CheckStepInfo = null;

        /**
         * Billing information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {TradeInfo || null}
         */
        this.TradeInfo = null;

        /**
         * Task error information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<ErrorInfoItem> || null}
         */
        this.ErrorInfo = null;

        /**
         * Whether the task can be reentered in the full export stage. Valid values: `yes`, `no`. `yes`: The current task can be reentered. `no`: The current task is in the full export stage which cannot be reentered. If the value of this parameter is `no`, the checkpoint restart is not supported when the task is restarted in the export stage.
         * @type {string || null}
         */
        this.DumperResumeCtrl = null;

        /**
         * Task throttling information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {RateLimitOption || null}
         */
        this.RateLimitOption = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.UpdateTime = 'UpdateTime' in params ? params.UpdateTime : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;
        this.BriefMsg = 'BriefMsg' in params ? params.BriefMsg : null;
        this.Status = 'Status' in params ? params.Status : null;

        if (params.Action) {
            let obj = new MigrateAction();
            obj.deserialize(params.Action)
            this.Action = obj;
        }

        if (params.StepInfo) {
            let obj = new MigrateDetailInfo();
            obj.deserialize(params.StepInfo)
            this.StepInfo = obj;
        }

        if (params.SrcInfo) {
            let obj = new DBEndpointInfo();
            obj.deserialize(params.SrcInfo)
            this.SrcInfo = obj;
        }

        if (params.DstInfo) {
            let obj = new DBEndpointInfo();
            obj.deserialize(params.DstInfo)
            this.DstInfo = obj;
        }

        if (params.CompareTask) {
            let obj = new CompareTaskInfo();
            obj.deserialize(params.CompareTask)
            this.CompareTask = obj;
        }

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }
        this.RunMode = 'RunMode' in params ? params.RunMode : null;
        this.ExpectRunTime = 'ExpectRunTime' in params ? params.ExpectRunTime : null;

        if (params.MigrateOption) {
            let obj = new MigrateOption();
            obj.deserialize(params.MigrateOption)
            this.MigrateOption = obj;
        }

        if (params.CheckStepInfo) {
            let obj = new CheckStepInfo();
            obj.deserialize(params.CheckStepInfo)
            this.CheckStepInfo = obj;
        }

        if (params.TradeInfo) {
            let obj = new TradeInfo();
            obj.deserialize(params.TradeInfo)
            this.TradeInfo = obj;
        }

        if (params.ErrorInfo) {
            this.ErrorInfo = new Array();
            for (let z in params.ErrorInfo) {
                let obj = new ErrorInfoItem();
                obj.deserialize(params.ErrorInfo[z]);
                this.ErrorInfo.push(obj);
            }
        }
        this.DumperResumeCtrl = 'DumperResumeCtrl' in params ? params.DumperResumeCtrl : null;

        if (params.RateLimitOption) {
            let obj = new RateLimitOption();
            obj.deserialize(params.RateLimitOption)
            this.RateLimitOption = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateModifyCheckSyncJob response structure.
 * @class
 */
class CreateModifyCheckSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyMigrateName request structure.
 * @class
 */
class ModifyMigrateNameRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * New migration task name
         * @type {string || null}
         */
        this.JobName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.JobName = 'JobName' in params ? params.JobName : null;

    }
}

/**
 * CreateSubscribe request structure.
 * @class
 */
class CreateSubscribeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription database type. Currently, cynosdbmysql, mariadb, mongodb, mysql, percona, tdpg, and tdsqlpercona are supported.
         * @type {string || null}
         */
        this.Product = null;

        /**
         * Payment method. Valid values: 0 (monthly subscription); 1 (pay-as-you-go).
         * @type {number || null}
         */
        this.PayType = null;

        /**
         * Purchase duration. This field needs to be filled in when the payType is monthly subscription. The unit is month. Value range: 1-120. Default value: 1.
         * @type {number || null}
         */
        this.Duration = null;

        /**
         * Whether to renew automatically. This field needs to be filled in when the payType is monthly subscription. Valid values: 0 (auto-renewal disabled); 1 (auto-renewal enabled). Automatic renewal is not performed by default. This flag is invalid for pay-as-you-go.
         * @type {number || null}
         */
        this.AutoRenew = null;

        /**
         * Quantity. Default value: 1. Maximum value: 10.
         * @type {number || null}
         */
        this.Count = null;

        /**
         * Instance resource tags
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Custom task name
         * @type {string || null}
         */
        this.Name = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Product = 'Product' in params ? params.Product : null;
        this.PayType = 'PayType' in params ? params.PayType : null;
        this.Duration = 'Duration' in params ? params.Duration : null;
        this.AutoRenew = 'AutoRenew' in params ? params.AutoRenew : null;
        this.Count = 'Count' in params ? params.Count : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }
        this.Name = 'Name' in params ? params.Name : null;

    }
}

/**
 * StartSyncJob response structure.
 * @class
 */
class StartSyncJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * StartMigrateJob request structure.
 * @class
 */
class StartMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * Kafka partition rules for subscription tasks. Data that matches the regex of the database name and table name will be delivered to the Kafka partition according to the RuleType . If multiple rules are configured, the first hit rule will take effect according to the configured order.
 * @class
 */
class DistributeRule extends  AbstractModel {
    constructor(){
        super();

        /**
         * Rule type. Valid values for non-mongo products: table (partitioned by table name); pk (partitioned by table name + primary key); cols (partitioned by column name). Valid values for mongo: collection (partitioned by collection name); collectionAndObjectId (partitioned by collection + primary key). Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RuleType = null;

        /**
         * Database name matching rule, please fill in the regular expression.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbPattern = null;

        /**
         * Table name matching rule. If DatabaseType is mongodb, it matches the collection name.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TablePattern = null;

        /**
         * Column name. This field is required if RuleType is cols. The subscription task will use the value of this column to calculate the partition. Mongo does not partition by column, so there is no need to pass this field.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Columns = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RuleType = 'RuleType' in params ? params.RuleType : null;
        this.DbPattern = 'DbPattern' in params ? params.DbPattern : null;
        this.TablePattern = 'TablePattern' in params ? params.TablePattern : null;
        this.Columns = 'Columns' in params ? params.Columns : null;

    }
}

/**
 * Description of synced database objects
 * @class
 */
class Objects extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync object type. Valid value: `Partial` (Partial objects). Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Mode = null;

        /**
         * Sync object, which is required if `Mode` is `Partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<Database> || null}
         */
        this.Databases = null;

        /**
         * Advanced object types, such as function and procedure. Note: If you want to migrate and synchronize advanced objects, the corresponding advanced object type should be included in this configuration. When advanced objects need to be synchronized, the initialization type must include the structure initialization type, that is, the Options.InitType value of the task is Structure or Full.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.AdvancedObjects = null;

        /**
         * A redundant field that specifies the online DDL type
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {OnlineDDL || null}
         */
        this.OnlineDDL = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Mode = 'Mode' in params ? params.Mode : null;

        if (params.Databases) {
            this.Databases = new Array();
            for (let z in params.Databases) {
                let obj = new Database();
                obj.deserialize(params.Databases[z]);
                this.Databases.push(obj);
            }
        }
        this.AdvancedObjects = 'AdvancedObjects' in params ? params.AdvancedObjects : null;

        if (params.OnlineDDL) {
            let obj = new OnlineDDL();
            obj.deserialize(params.OnlineDDL)
            this.OnlineDDL = obj;
        }

    }
}

/**
 * DeleteConsumerGroup response structure.
 * @class
 */
class DeleteConsumerGroupResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Migration object information, which is case-sensitive when objects such as databases, tables, and views are configured.
 * @class
 */
class DBItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Name of the database to be migrated or synced, which is required if `ObjectMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbName = null;

        /**
         * Name of the database after migration or sync, which is the same as the source database name by default.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewDbName = null;

        /**
         * The schema to be migrated or synced
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SchemaName = null;

        /**
         * Name of the schema after migration or sync
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewSchemaName = null;

        /**
         * Database selection mode, which is required if `ObjectMode` is `partial`. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DBMode = null;

        /**
         * Schema selection mode. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SchemaMode = null;

        /**
         * Table selection mode, which is required if `DBMode` is `partial`. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableMode = null;

        /**
         * The set of table objects, which is required if `TableMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TableItem> || null}
         */
        this.Tables = null;

        /**
         * View selection mode. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ViewMode = null;

        /**
         * The set of view objects, which is required if `ViewMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<ViewItem> || null}
         */
        this.Views = null;

        /**
         * Role selection mode, which is exclusive to PostgreSQL. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RoleMode = null;

        /**
         * Role, which is exclusive to PostgreSQL and required if `RoleMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<RoleItem> || null}
         */
        this.Roles = null;

        /**
         * Sync mode. Valid values: `partial`, `all`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FunctionMode = null;

        /**
         * Sync mode. Valid values: `partial`, `all`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TriggerMode = null;

        /**
         * Sync mode. Valid values: `partial`, `all`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EventMode = null;

        /**
         * Sync mode. Valid values: `partial`, `all`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ProcedureMode = null;

        /**
         * This parameter is required if `FunctionMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Functions = null;

        /**
         * This parameter is required if `ProcedureMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Procedures = null;

        /**
         * This parameter is required if `EventMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Events = null;

        /**
         * This parameter is required if `TriggerMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Triggers = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.DbName = 'DbName' in params ? params.DbName : null;
        this.NewDbName = 'NewDbName' in params ? params.NewDbName : null;
        this.SchemaName = 'SchemaName' in params ? params.SchemaName : null;
        this.NewSchemaName = 'NewSchemaName' in params ? params.NewSchemaName : null;
        this.DBMode = 'DBMode' in params ? params.DBMode : null;
        this.SchemaMode = 'SchemaMode' in params ? params.SchemaMode : null;
        this.TableMode = 'TableMode' in params ? params.TableMode : null;

        if (params.Tables) {
            this.Tables = new Array();
            for (let z in params.Tables) {
                let obj = new TableItem();
                obj.deserialize(params.Tables[z]);
                this.Tables.push(obj);
            }
        }
        this.ViewMode = 'ViewMode' in params ? params.ViewMode : null;

        if (params.Views) {
            this.Views = new Array();
            for (let z in params.Views) {
                let obj = new ViewItem();
                obj.deserialize(params.Views[z]);
                this.Views.push(obj);
            }
        }
        this.RoleMode = 'RoleMode' in params ? params.RoleMode : null;

        if (params.Roles) {
            this.Roles = new Array();
            for (let z in params.Roles) {
                let obj = new RoleItem();
                obj.deserialize(params.Roles[z]);
                this.Roles.push(obj);
            }
        }
        this.FunctionMode = 'FunctionMode' in params ? params.FunctionMode : null;
        this.TriggerMode = 'TriggerMode' in params ? params.TriggerMode : null;
        this.EventMode = 'EventMode' in params ? params.EventMode : null;
        this.ProcedureMode = 'ProcedureMode' in params ? params.ProcedureMode : null;
        this.Functions = 'Functions' in params ? params.Functions : null;
        this.Procedures = 'Procedures' in params ? params.Procedures : null;
        this.Events = 'Events' in params ? params.Events : null;
        this.Triggers = 'Triggers' in params ? params.Triggers : null;

    }
}

/**
 * DeleteCompareTask request structure.
 * @class
 */
class DeleteCompareTaskRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Data consistency check task ID in the format of `dts-8yv4w2i1-cmp-37skmii9`
         * @type {string || null}
         */
        this.CompareTaskId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;

    }
}

/**
 * Information of the migration task execution process
 * @class
 */
class MigrateDetailInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of steps
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepAll = null;

        /**
         * Current step
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNow = null;

        /**
         * Source-replica lag in MB. This parameter takes effect only when the task is normal and is in the last step of migration or sync (binlog sync). If it is invalid, `-1` will be returned.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.MasterSlaveDistance = null;

        /**
         * Source-replica lag in seconds. This parameter takes effect only when the task is normal and is in the last step of migration or sync (binlog sync). If it is invalid, `-1` will be returned.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.SecondsBehindMaster = null;

        /**
         * Step information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<StepDetailInfo> || null}
         */
        this.StepInfo = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StepAll = 'StepAll' in params ? params.StepAll : null;
        this.StepNow = 'StepNow' in params ? params.StepNow : null;
        this.MasterSlaveDistance = 'MasterSlaveDistance' in params ? params.MasterSlaveDistance : null;
        this.SecondsBehindMaster = 'SecondsBehindMaster' in params ? params.SecondsBehindMaster : null;

        if (params.StepInfo) {
            this.StepInfo = new Array();
            for (let z in params.StepInfo) {
                let obj = new StepDetailInfo();
                obj.deserialize(params.StepInfo[z]);
                this.StepInfo.push(obj);
            }
        }

    }
}

/**
 * StopMigrateJob request structure.
 * @class
 */
class StopMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data migration task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * Information of the source and target databases in data sync
 * @class
 */
class Endpoint extends  AbstractModel {
    constructor(){
        super();

        /**
         * Region name, such as `ap-guangzhou`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Region = null;

        /**
         * Node type of TDSQL for MySQL. Enumerated values: `proxy`, `set`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Role = null;

        /**
         * Database kernel type, which is used to distinguish between different kernels in TDSQL. Valid values: `percona`, `mariadb`, `mysql`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbKernel = null;

        /**
         * Database instance ID in the format of `cdb-powiqx8q`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * Instance IP address, which is required if the access type is not `cdb`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Ip = null;

        /**
         * Instance port, which is required if the access type is not `cdb`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Port = null;

        /**
         * Username, which is required for an instance authenticated by username and password.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.User = null;

        /**
         * Password, which is required for an instance authenticated by username and password.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Password = null;

        /**
         * Database name, which is required if the database type is `cdwpg`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DbName = null;

        /**
         * VPC ID in the format of `vpc-92jblxto`, which is required if the access type is `vpc`, `dcg`, or `vpncloud`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * ID of the subnet in the VPC in the format of `subnet-3paxmkdz`, which is required if the access type is `vpc`, `dcg`, or `vpncloud`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SubnetId = null;

        /**
         * Short CVM instance ID in the format of `ins-olgl39y8`, which is required if the access type is `cvm`. It is the same as the instance ID displayed in the CVM console.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CvmInstanceId = null;

        /**
         * Direct Connect gateway ID in the format of `dcg-0rxtqqxb`, which is required if the access type is `dcg`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UniqDcgId = null;

        /**
         * VPN gateway ID in the format of `vpngw-9ghexg7q`, which is required if the access type is `vpncloud`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.UniqVpnGwId = null;

        /**
         * CCN instance ID in the format of `ccn-afp6kltc`, which is required if the access type is `ccn`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CcnId = null;

        /**
         * Cloud vendor type. For Alibaba Cloud ApsaraDB for RDS instances, enter `aliyun`; otherwise, enter `others`. Default value: `others`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Supplier = null;

        /**
         * Database version in the format of `5.6` or `5.7`, which takes effect only if the instance is an RDS instance. Default value: `5.6`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EngineVersion = null;

        /**
         * Instance account, which is required if the operation is performed across accounts.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Account = null;

        /**
         * The account to which the resource belongs. Valid values: empty or `self` (the current account); `other` (another account).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccountMode = null;

        /**
         * The role used for cross-account sync, which can contain [a-zA-Z0-9\-\_]+ and is required if the operation is performed across accounts.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.AccountRole = null;

        /**
         * External role ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RoleExternalId = null;

        /**
         * Temporary SecretId, you can obtain the temporary key by [GetFederationToken](https://intl.cloud.tencent.com/document/product/1312/48195?from_cn_redirect=1). This field is required if it is a cross-account instance.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TmpSecretId = null;

        /**
         * Temporary SecretKey, you can obtain the temporary key by [GetFederationToken](https://intl.cloud.tencent.com/document/product/1312/48195?from_cn_redirect=1). This field is required if it is a cross-account instance.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TmpSecretKey = null;

        /**
         * Temporary token, you can obtain the temporary key by [GetFederationToken](https://intl.cloud.tencent.com/document/product/1312/48195?from_cn_redirect=1). This field is required if it is a cross-account instance. Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TmpToken = null;

        /**
         * Whether to enable encrypted transfer (`UnEncrypted`: No; `Encrypted`: Yes). Default value: `UnEncrypted`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EncryptConn = null;

        /**
         * Network environment of the database. This parameter is required when `AccessType` is `ccn`. Valid values: `UserIDC` (user IDC), `TencentVPC` (Tencent Cloud VPC).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DatabaseNetEnv = null;

        /**
         * The root account of CCN in the scenario where the database is connected to CCN under another Tencent Cloud account
Note: This field may return `null`, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CcnOwnerUin = null;

        /**
         * 
         * @type {string || null}
         */
        this.ChildInstanceId = null;

        /**
         * 
         * @type {string || null}
         */
        this.ChildInstanceType = null;

        /**
         * 
         * @type {string || null}
         */
        this.SetId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Region = 'Region' in params ? params.Region : null;
        this.Role = 'Role' in params ? params.Role : null;
        this.DbKernel = 'DbKernel' in params ? params.DbKernel : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.Ip = 'Ip' in params ? params.Ip : null;
        this.Port = 'Port' in params ? params.Port : null;
        this.User = 'User' in params ? params.User : null;
        this.Password = 'Password' in params ? params.Password : null;
        this.DbName = 'DbName' in params ? params.DbName : null;
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.SubnetId = 'SubnetId' in params ? params.SubnetId : null;
        this.CvmInstanceId = 'CvmInstanceId' in params ? params.CvmInstanceId : null;
        this.UniqDcgId = 'UniqDcgId' in params ? params.UniqDcgId : null;
        this.UniqVpnGwId = 'UniqVpnGwId' in params ? params.UniqVpnGwId : null;
        this.CcnId = 'CcnId' in params ? params.CcnId : null;
        this.Supplier = 'Supplier' in params ? params.Supplier : null;
        this.EngineVersion = 'EngineVersion' in params ? params.EngineVersion : null;
        this.Account = 'Account' in params ? params.Account : null;
        this.AccountMode = 'AccountMode' in params ? params.AccountMode : null;
        this.AccountRole = 'AccountRole' in params ? params.AccountRole : null;
        this.RoleExternalId = 'RoleExternalId' in params ? params.RoleExternalId : null;
        this.TmpSecretId = 'TmpSecretId' in params ? params.TmpSecretId : null;
        this.TmpSecretKey = 'TmpSecretKey' in params ? params.TmpSecretKey : null;
        this.TmpToken = 'TmpToken' in params ? params.TmpToken : null;
        this.EncryptConn = 'EncryptConn' in params ? params.EncryptConn : null;
        this.DatabaseNetEnv = 'DatabaseNetEnv' in params ? params.DatabaseNetEnv : null;
        this.CcnOwnerUin = 'CcnOwnerUin' in params ? params.CcnOwnerUin : null;
        this.ChildInstanceId = 'ChildInstanceId' in params ? params.ChildInstanceId : null;
        this.ChildInstanceType = 'ChildInstanceType' in params ? params.ChildInstanceType : null;
        this.SetId = 'SetId' in params ? params.SetId : null;

    }
}

/**
 * ConfigureSubscribeJob request structure.
 * @class
 */
class ConfigureSubscribeJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Data subscription type. Valid values for non-mongo DatabaseType: all (full instance update); dml (data update); ddl (structure update); dmlAndDdl (data + structure update). Valid values for mongo DatabaseType: all (full instance update); database (subscribe to a table); collection (subscribe to a collection).
         * @type {string || null}
         */
        this.SubscribeMode = null;

        /**
         * Source database access type. Valid values: extranet (public network); vpncloud (VPN access); dcg (Direct Connect); ccn (CCN); cdb (database); cvm (self-build on CVM); intranet (intranet); vpc (VPC). Note: The specific optional values depend on the current link support capabilities.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Database node information
         * @type {Array.<EndpointItem> || null}
         */
        this.Endpoints = null;

        /**
         * Kafka configuration
         * @type {SubscribeKafkaConfig || null}
         */
        this.KafkaConfig = null;

        /**
         * Subscription database table information. When SubscribeMode is not all or ddl, SubscribeObjects is a required parameter.
         * @type {Array.<SubscribeObject> || null}
         */
        this.SubscribeObjects = null;

        /**
         * Subscription data format, such as: protobuf, json, avro. Note: The specific optional values depend on the current link support capabilities. For details on the data format, please refer to the consumption demo documentation on the official website.
         * @type {string || null}
         */
        this.Protocol = null;

        /**
         * mongo optional parameter: output aggregation settings.
         * @type {Array.<PipelineInfo> || null}
         */
        this.PipelineInfo = null;

        /**
         * Additional information added for the business. The parameter name is called key, and the parameter value is called value.Optional parameters for mysql: ProcessXA. If true is filled in, it will be processed. If it is left blank or filled with other values, it will not be processed.Optional parameters for mongo: SubscribeType. Currently only changeStream is supported. If not filled in, the default is changeStream.Other businesses currently have no optional parameters.
         * @type {Array.<KeyValuePairOption> || null}
         */
        this.ExtraAttr = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.SubscribeMode = 'SubscribeMode' in params ? params.SubscribeMode : null;
        this.AccessType = 'AccessType' in params ? params.AccessType : null;

        if (params.Endpoints) {
            this.Endpoints = new Array();
            for (let z in params.Endpoints) {
                let obj = new EndpointItem();
                obj.deserialize(params.Endpoints[z]);
                this.Endpoints.push(obj);
            }
        }

        if (params.KafkaConfig) {
            let obj = new SubscribeKafkaConfig();
            obj.deserialize(params.KafkaConfig)
            this.KafkaConfig = obj;
        }

        if (params.SubscribeObjects) {
            this.SubscribeObjects = new Array();
            for (let z in params.SubscribeObjects) {
                let obj = new SubscribeObject();
                obj.deserialize(params.SubscribeObjects[z]);
                this.SubscribeObjects.push(obj);
            }
        }
        this.Protocol = 'Protocol' in params ? params.Protocol : null;

        if (params.PipelineInfo) {
            this.PipelineInfo = new Array();
            for (let z in params.PipelineInfo) {
                let obj = new PipelineInfo();
                obj.deserialize(params.PipelineInfo[z]);
                this.PipelineInfo.push(obj);
            }
        }

        if (params.ExtraAttr) {
            this.ExtraAttr = new Array();
            for (let z in params.ExtraAttr) {
                let obj = new KeyValuePairOption();
                obj.deserialize(params.ExtraAttr[z]);
                this.ExtraAttr.push(obj);
            }
        }

    }
}

/**
 * Sync task information
 * @class
 */
class SyncJobInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Sync task ID, such as `sync-btso140`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Sync task name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * Billing mode. Valid values: `PostPay` (pay-as-you-go); `PrePay` (monthly subscription).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.PayMode = null;

        /**
         * Running mode. Valid values: `Immediate`, `Timed`. Default value: `Immediate`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RunMode = null;

        /**
         * Expected execution time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpectRunTime = null;

        /**
         * All supported operations
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.AllActions = null;

        /**
         * Operations that can be performed under the current status
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.Actions = null;

        /**
         * Sync options
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Options || null}
         */
        this.Options = null;

        /**
         * Sync database/table objects
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Objects || null}
         */
        this.Objects = null;

        /**
         * Task specification
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Specification = null;

        /**
         * Expiration time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ExpireTime = null;

        /**
         * Source database region, such as `ap-guangzhou`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SrcRegion = null;

        /**
         * Source database type, such as `mysql`, `cynosdbmysql`, `tdapg`, `tdpg`, and `tdsqlmysql`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SrcDatabaseType = null;

        /**
         * Source database access type. Valid values: `cdb` (database); `cvm` (self-build on CVM); `vpc` (VPC); `extranet` (public network); `vpncloud` (VPN access); `dcg` (Direct Connect); `ccn` (CCN); `intranet` (intranet).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SrcAccessType = null;

        /**
         * Source database information. This parameter is used by single-node databases.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Endpoint || null}
         */
        this.SrcInfo = null;

        /**
         * Valid values: `cluster`, `single`. `single`: For single-node source databases; `cluster`: For multi-node source databases.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.SrcNodeType = null;

        /**
         * Source database information. This parameter is used for multi-node databases.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {SyncDBEndpointInfos || null}
         */
        this.SrcInfos = null;

        /**
         * Target database region, such as `ap-guangzhou`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DstRegion = null;

        /**
         * Target database type, such as `mysql`, `cynosdbmysql`, `tdapg`, `tdpg`, and `tdsqlmysql`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DstDatabaseType = null;

        /**
         * Target database access type. Valid values: `cdb` (database); `cvm` (self-build on CVM); `vpc` (VPC); `extranet` (public network); `vpncloud` (VPN access); `dcg` (Direct Connect); `ccn` (CCN); `intranet` (intranet).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DstAccessType = null;

        /**
         * Target database information. This parameter is used by single-node databases.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Endpoint || null}
         */
        this.DstInfo = null;

        /**
         * Valid values: `cluster`, `single`. `single`: For single-node target databases; `cluster`: For multi-node target databases.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DstNodeType = null;

        /**
         * Target database information. This parameter is used for multi-node databases.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {SyncDBEndpointInfos || null}
         */
        this.DstInfos = null;

        /**
         * Creation time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CreateTime = null;

        /**
         * Start time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartTime = null;

        /**
         * Task status. Valid values: `UnInitialized`, `Initialized`, `Checking`, `CheckPass`, `CheckNotPass`, `ReadyRunning`, `Running`, `Pausing`, `Paused`, `Stopping`, `Stopped`, `ResumableErr`, `Resuming`, `Failed`, `Released`, `Resetting`, `Unknown`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * End time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EndTime = null;

        /**
         * Tag information
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * Step information of the sync task
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {SyncDetailInfo || null}
         */
        this.Detail = null;

        /**
         * Billing status. Valid values: `Normal`, `Resizing`, `Renewing`, `Isolating`, `Isolated`, `Offlining`, `Offlined`, `NotBilled`, `Recovering`, `PostPay2Prepaying`, `PrePay2Postpaying`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TradeStatus = null;

        /**
         * Sync link specification, such as `micro`, `small`, `medium`, and `large`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.InstanceClass = null;

        /**
         * Auto-renewal flag, which takes effect if `PayMode` is `PrePay`. Valid values: `1` (auto-renewal enabled); `0` (auto-renewal disabled).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.AutoRenew = null;

        /**
         * Deletion time in the format of `yyyy-mm-dd hh:mm:ss`
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.OfflineTime = null;

        /**
         * Settings of automatic retry time
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.AutoRetryTimeRangeMinutes = null;

        /**
         * Whether the task can be reentered in the full export stage. Valid values: `yes`, `no`. `yes`: The current task can be reentered. `no`: The current task is in the full export stage which cannot be reentered. If the value of this parameter is `no`, the checkpoint restart is not supported when the task is restarted in the export stage.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DumperResumeCtrl = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.PayMode = 'PayMode' in params ? params.PayMode : null;
        this.RunMode = 'RunMode' in params ? params.RunMode : null;
        this.ExpectRunTime = 'ExpectRunTime' in params ? params.ExpectRunTime : null;
        this.AllActions = 'AllActions' in params ? params.AllActions : null;
        this.Actions = 'Actions' in params ? params.Actions : null;

        if (params.Options) {
            let obj = new Options();
            obj.deserialize(params.Options)
            this.Options = obj;
        }

        if (params.Objects) {
            let obj = new Objects();
            obj.deserialize(params.Objects)
            this.Objects = obj;
        }
        this.Specification = 'Specification' in params ? params.Specification : null;
        this.ExpireTime = 'ExpireTime' in params ? params.ExpireTime : null;
        this.SrcRegion = 'SrcRegion' in params ? params.SrcRegion : null;
        this.SrcDatabaseType = 'SrcDatabaseType' in params ? params.SrcDatabaseType : null;
        this.SrcAccessType = 'SrcAccessType' in params ? params.SrcAccessType : null;

        if (params.SrcInfo) {
            let obj = new Endpoint();
            obj.deserialize(params.SrcInfo)
            this.SrcInfo = obj;
        }
        this.SrcNodeType = 'SrcNodeType' in params ? params.SrcNodeType : null;

        if (params.SrcInfos) {
            let obj = new SyncDBEndpointInfos();
            obj.deserialize(params.SrcInfos)
            this.SrcInfos = obj;
        }
        this.DstRegion = 'DstRegion' in params ? params.DstRegion : null;
        this.DstDatabaseType = 'DstDatabaseType' in params ? params.DstDatabaseType : null;
        this.DstAccessType = 'DstAccessType' in params ? params.DstAccessType : null;

        if (params.DstInfo) {
            let obj = new Endpoint();
            obj.deserialize(params.DstInfo)
            this.DstInfo = obj;
        }
        this.DstNodeType = 'DstNodeType' in params ? params.DstNodeType : null;

        if (params.DstInfos) {
            let obj = new SyncDBEndpointInfos();
            obj.deserialize(params.DstInfos)
            this.DstInfos = obj;
        }
        this.CreateTime = 'CreateTime' in params ? params.CreateTime : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.EndTime = 'EndTime' in params ? params.EndTime : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

        if (params.Detail) {
            let obj = new SyncDetailInfo();
            obj.deserialize(params.Detail)
            this.Detail = obj;
        }
        this.TradeStatus = 'TradeStatus' in params ? params.TradeStatus : null;
        this.InstanceClass = 'InstanceClass' in params ? params.InstanceClass : null;
        this.AutoRenew = 'AutoRenew' in params ? params.AutoRenew : null;
        this.OfflineTime = 'OfflineTime' in params ? params.OfflineTime : null;
        this.AutoRetryTimeRangeMinutes = 'AutoRetryTimeRangeMinutes' in params ? params.AutoRetryTimeRangeMinutes : null;
        this.DumperResumeCtrl = 'DumperResumeCtrl' in params ? params.DumperResumeCtrl : null;

    }
}

/**
 * DescribeSubscribeCheckJob response structure.
 * @class
 */
class DescribeSubscribeCheckJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Failure or error prompts, success signals 'success'.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Job running status. Valid values: running, failed, success.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Current overall progress. Value range: 0-100.
         * @type {number || null}
         */
        this.Progress = null;

        /**
         * Total check steps
         * @type {number || null}
         */
        this.StepAll = null;

        /**
         * Current step in execution
         * @type {number || null}
         */
        this.StepNow = null;

        /**
         * Running status of each stepNote: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<SubscribeCheckStepInfo> || null}
         */
        this.Steps = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.Message = 'Message' in params ? params.Message : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.Progress = 'Progress' in params ? params.Progress : null;
        this.StepAll = 'StepAll' in params ? params.StepAll : null;
        this.StepNow = 'StepNow' in params ? params.StepNow : null;

        if (params.Steps) {
            this.Steps = new Array();
            for (let z in params.Steps) {
                let obj = new SubscribeCheckStepInfo();
                obj.deserialize(params.Steps[z]);
                this.Steps.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Role object, which is exclusive to PostgreSQL.
 * @class
 */
class RoleItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Role name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RoleName = null;

        /**
         * Role name after migration
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewRoleName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RoleName = 'RoleName' in params ? params.RoleName : null;
        this.NewRoleName = 'NewRoleName' in params ? params.NewRoleName : null;

    }
}

/**
 * Tag filter
 * @class
 */
class TagFilter extends  AbstractModel {
    constructor(){
        super();

        /**
         * Tag key
         * @type {string || null}
         */
        this.TagKey = null;

        /**
         * Tag value
         * @type {Array.<string> || null}
         */
        this.TagValue = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TagKey = 'TagKey' in params ? params.TagKey : null;
        this.TagValue = 'TagValue' in params ? params.TagValue : null;

    }
}

/**
 * Step information
 * @class
 */
class StepDetailInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Step number
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.StepNo = null;

        /**
         * Step name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepName = null;

        /**
         * Step ID
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepId = null;

        /**
         * Step status. Valid values: `success`, `failed`, `running`, `notStarted`. Default value: `notStarted`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Start time of the current step in the format of "yyyy-mm-dd hh:mm:ss". If this field does not exist or is empty, it is meaningless.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StartTime = null;

        /**
         * Step error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.StepMessage = null;

        /**
         * Execution progress
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Percent = null;

        /**
         * Error message
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<ProcessStepTip> || null}
         */
        this.Errors = null;

        /**
         * Warning
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<ProcessStepTip> || null}
         */
        this.Warnings = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.StepNo = 'StepNo' in params ? params.StepNo : null;
        this.StepName = 'StepName' in params ? params.StepName : null;
        this.StepId = 'StepId' in params ? params.StepId : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.StartTime = 'StartTime' in params ? params.StartTime : null;
        this.StepMessage = 'StepMessage' in params ? params.StepMessage : null;
        this.Percent = 'Percent' in params ? params.Percent : null;

        if (params.Errors) {
            this.Errors = new Array();
            for (let z in params.Errors) {
                let obj = new ProcessStepTip();
                obj.deserialize(params.Errors[z]);
                this.Errors.push(obj);
            }
        }

        if (params.Warnings) {
            this.Warnings = new Array();
            for (let z in params.Warnings) {
                let obj = new ProcessStepTip();
                obj.deserialize(params.Warnings[z]);
                this.Warnings.push(obj);
            }
        }

    }
}

/**
 * CreateSyncJob request structure.
 * @class
 */
class CreateSyncJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Billing mode. Valid values: `PrePay` (monthly subscription); `PostPay` (pay-as-you-go). Currently, DTS at Tencent Cloud International is free of charge.
         * @type {string || null}
         */
        this.PayMode = null;

        /**
         * Source database type, such as `mysql`, `cynosdbmysql`, `tdapg`, `tdpg`, and `tdsqlmysql`.
         * @type {string || null}
         */
        this.SrcDatabaseType = null;

        /**
         * Source database region, such as `ap-guangzhou`.
         * @type {string || null}
         */
        this.SrcRegion = null;

        /**
         * Target database type, such as `mysql`, `cynosdbmysql`, `tdapg`, `tdpg`, `tdsqlmysql`, and `kafka`.
         * @type {string || null}
         */
        this.DstDatabaseType = null;

        /**
         * Target database region, such as `ap-guangzhou`.
         * @type {string || null}
         */
        this.DstRegion = null;

        /**
         * Sync task specification, such as `Standard`.
         * @type {string || null}
         */
        this.Specification = null;

        /**
         * Tag information
         * @type {Array.<TagItem> || null}
         */
        this.Tags = null;

        /**
         * The number of sync tasks purchased at a time. Value range: [1, 10]. Default value: `1`.
         * @type {number || null}
         */
        this.Count = null;

        /**
         * Auto-renewal flag, which takes effect if `PayMode` is `PrePay`. Valid values: `1` (auto-renewal enabled); `0` (auto-renewal disabled). Default value: `0`.
         * @type {number || null}
         */
        this.AutoRenew = null;

        /**
         * Sync link specification, such as `micro`, `small`, `medium`, and `large`. Default value: `medium`.
         * @type {string || null}
         */
        this.InstanceClass = null;

        /**
         * Sync task name
         * @type {string || null}
         */
        this.JobName = null;

        /**
         * ID of the existing task used to create a similar task
         * @type {string || null}
         */
        this.ExistedJobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.PayMode = 'PayMode' in params ? params.PayMode : null;
        this.SrcDatabaseType = 'SrcDatabaseType' in params ? params.SrcDatabaseType : null;
        this.SrcRegion = 'SrcRegion' in params ? params.SrcRegion : null;
        this.DstDatabaseType = 'DstDatabaseType' in params ? params.DstDatabaseType : null;
        this.DstRegion = 'DstRegion' in params ? params.DstRegion : null;
        this.Specification = 'Specification' in params ? params.Specification : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagItem();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }
        this.Count = 'Count' in params ? params.Count : null;
        this.AutoRenew = 'AutoRenew' in params ? params.AutoRenew : null;
        this.InstanceClass = 'InstanceClass' in params ? params.InstanceClass : null;
        this.JobName = 'JobName' in params ? params.JobName : null;
        this.ExistedJobId = 'ExistedJobId' in params ? params.ExistedJobId : null;

    }
}

/**
 * Number of subscribed Kafka partitions and partition rules. mariadb, percona, tdsqlmysql, tdpg do not support custom partitions, so DistributeRules and DefaultRuleType can be left blank, but NumberOfPartitions is required.
 * @class
 */
class SubscribeKafkaConfig extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of Kafka partitions. Valid values: 1, 4, 8.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.NumberOfPartitions = null;

        /**
         * Partition rules. This field is required when NumberOfPartitions > 1.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DistributeRule> || null}
         */
        this.DistributeRules = null;

        /**
         * Default partitioning policy. If NumberOfPartitions > 1, this field is required. Data that does not meet the regex in DistributeRules will be partitioned according to the default partitioning policy.Valid values for non-mongo products: table (partitioned by table name); pk (partitioned by table name + primary key). Valid values for mongo: collection (partitioned by collection name). This field is used in conjunction with DistributeRules. If this field is configured, it is considered as configuring a DistributeRules.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.DefaultRuleType = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.NumberOfPartitions = 'NumberOfPartitions' in params ? params.NumberOfPartitions : null;

        if (params.DistributeRules) {
            this.DistributeRules = new Array();
            for (let z in params.DistributeRules) {
                let obj = new DistributeRule();
                obj.deserialize(params.DistributeRules[z]);
                this.DistributeRules.push(obj);
            }
        }
        this.DefaultRuleType = 'DefaultRuleType' in params ? params.DefaultRuleType : null;

    }
}

/**
 * DescribeCompareReport request structure.
 * @class
 */
class DescribeCompareReportRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task ID
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Check task ID
         * @type {string || null}
         */
        this.CompareTaskId = null;

        /**
         * Number of inconsistent objects to be returned
         * @type {number || null}
         */
        this.DifferenceLimit = null;

        /**
         * Offset of inconsistent objects
         * @type {number || null}
         */
        this.DifferenceOffset = null;

        /**
         * Search criterion: Inconsistent database name
         * @type {string || null}
         */
        this.DifferenceDB = null;

        /**
         * Search criterion: Inconsistent table name
         * @type {string || null}
         */
        this.DifferenceTable = null;

        /**
         * Number of unchecked objects to be returned
         * @type {number || null}
         */
        this.SkippedLimit = null;

        /**
         * Offset of unchecked objects
         * @type {number || null}
         */
        this.SkippedOffset = null;

        /**
         * Search criterion: Unchecked database name
         * @type {string || null}
         */
        this.SkippedDB = null;

        /**
         * Search criterion: Unchecked table name
         * @type {string || null}
         */
        this.SkippedTable = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;
        this.CompareTaskId = 'CompareTaskId' in params ? params.CompareTaskId : null;
        this.DifferenceLimit = 'DifferenceLimit' in params ? params.DifferenceLimit : null;
        this.DifferenceOffset = 'DifferenceOffset' in params ? params.DifferenceOffset : null;
        this.DifferenceDB = 'DifferenceDB' in params ? params.DifferenceDB : null;
        this.DifferenceTable = 'DifferenceTable' in params ? params.DifferenceTable : null;
        this.SkippedLimit = 'SkippedLimit' in params ? params.SkippedLimit : null;
        this.SkippedOffset = 'SkippedOffset' in params ? params.SkippedOffset : null;
        this.SkippedDB = 'SkippedDB' in params ? params.SkippedDB : null;
        this.SkippedTable = 'SkippedTable' in params ? params.SkippedTable : null;

    }
}

/**
 * Details of skipped tables
 * @class
 */
class SkippedItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Database name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Db = null;

        /**
         * Table name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Table = null;

        /**
         * The cause why check is not initiated
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Reason = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Db = 'Db' in params ? params.Db : null;
        this.Table = 'Table' in params ? params.Table : null;
        this.Reason = 'Reason' in params ? params.Reason : null;

    }
}

/**
 * IsolateSubscribe request structure.
 * @class
 */
class IsolateSubscribeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * DescribeSubscribeReturnable response structure.
 * @class
 */
class DescribeSubscribeReturnableResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Whether the instance is returnable
         * @type {boolean || null}
         */
        this.IsReturnable = null;

        /**
         * Reason for the non-returnability
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ReturnFailMessage = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.IsReturnable = 'IsReturnable' in params ? params.IsReturnable : null;
        this.ReturnFailMessage = 'ReturnFailMessage' in params ? params.ReturnFailMessage : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Tag
 * @class
 */
class TagItem extends  AbstractModel {
    constructor(){
        super();

        /**
         * Tag key
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TagKey = null;

        /**
         * Tag value
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TagValue = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TagKey = 'TagKey' in params ? params.TagKey : null;
        this.TagValue = 'TagValue' in params ? params.TagValue : null;

    }
}

/**
 * RecoverMigrateJob request structure.
 * @class
 */
class RecoverMigrateJobRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Task ID
         * @type {string || null}
         */
        this.JobId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

    }
}

/**
 * Online DDL type
 * @class
 */
class OnlineDDL extends  AbstractModel {
    constructor(){
        super();

        /**
         * Status
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Status = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Status = 'Status' in params ? params.Status : null;

    }
}

/**
 * DescribeSubscribeJobs response structure.
 * @class
 */
class DescribeSubscribeJobsResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of eligible instances.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Information list of data subscription instances
         * @type {Array.<SubscribeInfo> || null}
         */
        this.Items = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.Items) {
            this.Items = new Array();
            for (let z in params.Items) {
                let obj = new SubscribeInfo();
                obj.deserialize(params.Items[z]);
                this.Items.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ResetSubscribe request structure.
 * @class
 */
class ResetSubscribeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data subscription instance ID
         * @type {string || null}
         */
        this.SubscribeId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;

    }
}

/**
 * Migration object options, which tell DTS which database/table objects should be migrated.
 * @class
 */
class DatabaseTableObject extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration object type. Valid values: `all`, `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ObjectMode = null;

        /**
         * Migration object, which is required if `ObjectMode` is `partial`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<DBItem> || null}
         */
        this.Databases = null;

        /**
         * Advanced object types, such as trigger, function, procedure, event. Note: If you want to migrate and synchronize advanced objects, the corresponding advanced object type should be included in this configuration.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.AdvancedObjects = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ObjectMode = 'ObjectMode' in params ? params.ObjectMode : null;

        if (params.Databases) {
            this.Databases = new Array();
            for (let z in params.Databases) {
                let obj = new DBItem();
                obj.deserialize(params.Databases[z]);
                this.Databases.push(obj);
            }
        }
        this.AdvancedObjects = 'AdvancedObjects' in params ? params.AdvancedObjects : null;

    }
}

/**
 * ModifyMigrateRuntimeAttribute request structure.
 * @class
 */
class ModifyMigrateRuntimeAttributeRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Migration task id, for example: dts-2rgv0f09
         * @type {string || null}
         */
        this.JobId = null;

        /**
         * Attributes that need to be modified. This structure is designed as a generic structure to separate customized attributes for multiple businesses. <br>For instance, for Redis:<br>{<br>	 "Key": "DstWriteMode",	// Target database write mode<br> 	"Value": "normal"	          // clearData (clear target instance data), overwrite (perform task in overwrite manner), normal (follow normal procedure, no additional actions, this is the default value) <br>},<br>{<br/>	 "Key": "IsDstReadOnly",	// Whether to set target database as read-only during migration<br/> 	"Value": "true"	          // true (set as read-only), false (do not set as read-only) <br/>}
         * @type {Array.<KeyValuePairOption> || null}
         */
        this.OtherOptions = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.JobId = 'JobId' in params ? params.JobId : null;

        if (params.OtherOptions) {
            this.OtherOptions = new Array();
            for (let z in params.OtherOptions) {
                let obj = new KeyValuePairOption();
                obj.deserialize(params.OtherOptions[z]);
                this.OtherOptions.push(obj);
            }
        }

    }
}

/**
 * PauseMigrateJob response structure.
 * @class
 */
class PauseMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Synced table description
 * @class
 */
class Table extends  AbstractModel {
    constructor(){
        super();

        /**
         * Table name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableName = null;

        /**
         * New table name
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.NewTableName = null;

        /**
         * Filter condition
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.FilterCondition = null;

        /**
         * Whether to synchronize all columns in the table. All: all columns under the current table; Partial (the corresponding field ColumnMode in ModifySyncJobConfig interface does not support Partial at the moment): some columns under the current table, detailed table information is provided by filling the Columns field.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ColumnMode = null;

        /**
         * Column information in data sync. This field is required when ColumnMode is set to Partial.Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<Column> || null}
         */
        this.Columns = null;

        /**
         * The temp tables to be synced. This parameter is mutually exclusive with `NewTableName`. It is valid only when the configured sync objects are table-level ones and `TableEditMode` is `pt`. To sync temp tables generated when pt-osc or other tools are used during the sync process, you must configure this parameter first. For example, if you want to perform the pt-osc operation on a table named "t1", configure this parameter as ["\_t1\_new","\_t1\_old"]; to perform the gh-ost operation on t1, configure it as ["\_t1\_ghc","\_t1\_gho","\_t1\_del"]. Temp tables generated by pt-osc and gh-ost operations can be configured at the same time.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<string> || null}
         */
        this.TmpTables = null;

        /**
         * Table editing type. Valid values: `rename` (table mapping); `pt` (additional table sync).
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.TableEditMode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TableName = 'TableName' in params ? params.TableName : null;
        this.NewTableName = 'NewTableName' in params ? params.NewTableName : null;
        this.FilterCondition = 'FilterCondition' in params ? params.FilterCondition : null;
        this.ColumnMode = 'ColumnMode' in params ? params.ColumnMode : null;

        if (params.Columns) {
            this.Columns = new Array();
            for (let z in params.Columns) {
                let obj = new Column();
                obj.deserialize(params.Columns[z]);
                this.Columns.push(obj);
            }
        }
        this.TmpTables = 'TmpTables' in params ? params.TmpTables : null;
        this.TableEditMode = 'TableEditMode' in params ? params.TableEditMode : null;

    }
}

/**
 * Prompts for subscription check tasks
 * @class
 */
class SubscribeCheckStepTip extends  AbstractModel {
    constructor(){
        super();

        /**
         * Error or warning detailsNote: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Message = null;

        /**
         * Help documentation
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.HelpDoc = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Message = 'Message' in params ? params.Message : null;
        this.HelpDoc = 'HelpDoc' in params ? params.HelpDoc : null;

    }
}

/**
 * Data consistency check details
 * @class
 */
class CompareDetailInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Details of inconsistent tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {DifferenceDetail || null}
         */
        this.Difference = null;

        /**
         * Details of skipped tables
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {SkippedDetail || null}
         */
        this.Skipped = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Difference) {
            let obj = new DifferenceDetail();
            obj.deserialize(params.Difference)
            this.Difference = obj;
        }

        if (params.Skipped) {
            let obj = new SkippedDetail();
            obj.deserialize(params.Skipped)
            this.Skipped = obj;
        }

    }
}

/**
 * DescribeSubscribeJobs request structure.
 * @class
 */
class DescribeSubscribeJobsRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Subscription ID (exact match)
         * @type {string || null}
         */
        this.SubscribeId = null;

        /**
         * Subscription name (prefix fuzzy match)
         * @type {string || null}
         */
        this.SubscribeName = null;

        /**
         * Subscribed cloud database instance ID (exact match)
         * @type {string || null}
         */
        this.InstanceId = null;

        /**
         * Payment method. Valid values: 0 (monthly subscription); 1 (pay-as-you-go).
         * @type {number || null}
         */
        this.PayType = null;

        /**
         * Subscribed database product. Currently, cynosdbmysql, mariadb, mongodb, mysql, percona, tdpg, tdsqlpercona are supported.
         * @type {string || null}
         */
        this.Product = null;

        /**
         * Data subscription lifecycle status. Valid values: normal, isolating, isolated, offline, post2PrePayIng.
         * @type {Array.<string> || null}
         */
        this.Status = null;

        /**
         * Data subscription status. Valid values: notStarted, checking, checkNotPass, checkPass, starting, running, error.
         * @type {Array.<string> || null}
         */
        this.SubsStatus = null;

        /**
         * Starting offset for returned results. Default value: 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of results to be returned at a time. Default value: 20. Maximum value: 100.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Sorting order. Valid values: DESC, ASC. Default value: DESC, indicating descending by creation time.
         * @type {string || null}
         */
        this.OrderDirection = null;

        /**
         * Tag filter condition, the relationship between multiple TagFilters is and.
         * @type {Array.<TagFilter> || null}
         */
        this.TagFilters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.SubscribeId = 'SubscribeId' in params ? params.SubscribeId : null;
        this.SubscribeName = 'SubscribeName' in params ? params.SubscribeName : null;
        this.InstanceId = 'InstanceId' in params ? params.InstanceId : null;
        this.PayType = 'PayType' in params ? params.PayType : null;
        this.Product = 'Product' in params ? params.Product : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.SubsStatus = 'SubsStatus' in params ? params.SubsStatus : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;
        this.OrderDirection = 'OrderDirection' in params ? params.OrderDirection : null;

        if (params.TagFilters) {
            this.TagFilters = new Array();
            for (let z in params.TagFilters) {
                let obj = new TagFilter();
                obj.deserialize(params.TagFilters[z]);
                this.TagFilters.push(obj);
            }
        }

    }
}

/**
 * StartMigrateJob response structure.
 * @class
 */
class StartMigrateJobResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Data consistency check option. Data consistency check is disabled by default.
 * @class
 */
class ConsistencyOption extends  AbstractModel {
    constructor(){
        super();

        /**
         * Data consistency check type. Valid values: `full`, `noCheck`, `notConfigured`.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Mode = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Mode = 'Mode' in params ? params.Mode : null;

    }
}

module.exports = {
    ModifyCompareTaskResponse: ModifyCompareTaskResponse,
    DescribeSyncJobsResponse: DescribeSyncJobsResponse,
    ModifyMigrationJobResponse: ModifyMigrationJobResponse,
    ResetConsumerGroupOffsetResponse: ResetConsumerGroupOffsetResponse,
    ModifyMigrateRateLimitResponse: ModifyMigrateRateLimitResponse,
    IsolateMigrateJobResponse: IsolateMigrateJobResponse,
    ModifyMigrateJobSpecRequest: ModifyMigrateJobSpecRequest,
    IsolateSubscribeResponse: IsolateSubscribeResponse,
    ModifyConsumerGroupPasswordRequest: ModifyConsumerGroupPasswordRequest,
    StepTip: StepTip,
    ModifySyncRateLimitResponse: ModifySyncRateLimitResponse,
    DestroyMigrateJobRequest: DestroyMigrateJobRequest,
    ModifySubscribeNameRequest: ModifySubscribeNameRequest,
    OffsetTimeMap: OffsetTimeMap,
    SkipCheckItemResponse: SkipCheckItemResponse,
    ResumeSyncJobRequest: ResumeSyncJobRequest,
    PartitionAssignment: PartitionAssignment,
    ResizeSyncJobResponse: ResizeSyncJobResponse,
    CreateSubscribeCheckJobRequest: CreateSubscribeCheckJobRequest,
    ResumeMigrateJobResponse: ResumeMigrateJobResponse,
    DifferenceItem: DifferenceItem,
    CreateModifyCheckSyncJobRequest: CreateModifyCheckSyncJobRequest,
    IsolateSyncJobRequest: IsolateSyncJobRequest,
    PauseMigrateJobRequest: PauseMigrateJobRequest,
    ContinueMigrateJobRequest: ContinueMigrateJobRequest,
    ResetConsumerGroupOffsetRequest: ResetConsumerGroupOffsetRequest,
    ModifySyncRateLimitRequest: ModifySyncRateLimitRequest,
    DescribeCheckSyncJobResultRequest: DescribeCheckSyncJobResultRequest,
    ModifySubscribeAutoRenewFlagResponse: ModifySubscribeAutoRenewFlagResponse,
    DestroySyncJobResponse: DestroySyncJobResponse,
    ErrorInfoItem: ErrorInfoItem,
    IsolateMigrateJobRequest: IsolateMigrateJobRequest,
    StopMigrateJobResponse: StopMigrateJobResponse,
    TableItem: TableItem,
    SubscribeInfo: SubscribeInfo,
    ModifyCompareTaskNameRequest: ModifyCompareTaskNameRequest,
    CompleteMigrateJobResponse: CompleteMigrateJobResponse,
    DescribeMigrateDBInstancesResponse: DescribeMigrateDBInstancesResponse,
    KeyValuePairOption: KeyValuePairOption,
    CreateCheckSyncJobRequest: CreateCheckSyncJobRequest,
    DescribeModifyCheckSyncJobResultResponse: DescribeModifyCheckSyncJobResultResponse,
    StartSubscribeResponse: StartSubscribeResponse,
    DescribeSubscribeReturnableRequest: DescribeSubscribeReturnableRequest,
    DescribeMigrationDetailRequest: DescribeMigrationDetailRequest,
    CreateConsumerGroupRequest: CreateConsumerGroupRequest,
    ResizeSyncJobRequest: ResizeSyncJobRequest,
    ModifySubscribeNameResponse: ModifySubscribeNameResponse,
    DdlOption: DdlOption,
    ConflictHandleOption: ConflictHandleOption,
    PipelineInfo: PipelineInfo,
    ResumeSyncJobResponse: ResumeSyncJobResponse,
    RecoverMigrateJobResponse: RecoverMigrateJobResponse,
    ModifyCompareTaskNameResponse: ModifyCompareTaskNameResponse,
    StartSyncJobRequest: StartSyncJobRequest,
    StartSubscribeRequest: StartSubscribeRequest,
    ModifyMigrateRuntimeAttributeResponse: ModifyMigrateRuntimeAttributeResponse,
    DescribeOffsetByTimeResponse: DescribeOffsetByTimeResponse,
    PauseSyncJobRequest: PauseSyncJobRequest,
    CreateMigrateCheckJobResponse: CreateMigrateCheckJobResponse,
    ModifySyncJobConfigRequest: ModifySyncJobConfigRequest,
    ContinueMigrateJobResponse: ContinueMigrateJobResponse,
    CreateMigrationServiceRequest: CreateMigrationServiceRequest,
    DetailCheckItem: DetailCheckItem,
    DescribeCompareTasksRequest: DescribeCompareTasksRequest,
    DestroyIsolatedSubscribeRequest: DestroyIsolatedSubscribeRequest,
    ResetSubscribeResponse: ResetSubscribeResponse,
    CompareObject: CompareObject,
    DescribeCompareReportResponse: DescribeCompareReportResponse,
    RecoverSyncJobResponse: RecoverSyncJobResponse,
    MigrateAction: MigrateAction,
    ConfigureSubscribeJobResponse: ConfigureSubscribeJobResponse,
    DescribeConsumerGroupsRequest: DescribeConsumerGroupsRequest,
    GroupInfo: GroupInfo,
    DeleteCompareTaskResponse: DeleteCompareTaskResponse,
    DBEndpointInfo: DBEndpointInfo,
    ResumeSubscribeRequest: ResumeSubscribeRequest,
    ModifySyncJobConfigResponse: ModifySyncJobConfigResponse,
    CompareColumnItem: CompareColumnItem,
    DescribeSubscribeDetailResponse: DescribeSubscribeDetailResponse,
    ContinueSyncJobResponse: ContinueSyncJobResponse,
    TradeInfo: TradeInfo,
    Options: Options,
    DeleteConsumerGroupRequest: DeleteConsumerGroupRequest,
    ModifySubscribeAutoRenewFlagRequest: ModifySubscribeAutoRenewFlagRequest,
    CompleteMigrateJobRequest: CompleteMigrateJobRequest,
    CreateConsumerGroupResponse: CreateConsumerGroupResponse,
    StopCompareRequest: StopCompareRequest,
    SyncDBEndpointInfos: SyncDBEndpointInfos,
    StartModifySyncJobRequest: StartModifySyncJobRequest,
    DescribeCheckSyncJobResultResponse: DescribeCheckSyncJobResultResponse,
    StopSyncJobResponse: StopSyncJobResponse,
    MigrateOption: MigrateOption,
    DescribeSubscribeDetailRequest: DescribeSubscribeDetailRequest,
    SkippedDetail: SkippedDetail,
    SubsErr: SubsErr,
    CreateSubscribeResponse: CreateSubscribeResponse,
    CompareOptions: CompareOptions,
    ModifyMigrateNameResponse: ModifyMigrateNameResponse,
    DescribeMigrationJobsResponse: DescribeMigrationJobsResponse,
    ModifyMigrationJobRequest: ModifyMigrationJobRequest,
    StopCompareResponse: StopCompareResponse,
    DestroyMigrateJobResponse: DestroyMigrateJobResponse,
    ProcessProgress: ProcessProgress,
    SkipSyncCheckItemRequest: SkipSyncCheckItemRequest,
    DescribeModifyCheckSyncJobResultRequest: DescribeModifyCheckSyncJobResultRequest,
    SkipSyncCheckItemResponse: SkipSyncCheckItemResponse,
    IsolateSyncJobResponse: IsolateSyncJobResponse,
    CreateMigrateCheckJobRequest: CreateMigrateCheckJobRequest,
    ModifyConsumerGroupPasswordResponse: ModifyConsumerGroupPasswordResponse,
    DescribeMigrationJobsRequest: DescribeMigrationJobsRequest,
    CompareTaskInfo: CompareTaskInfo,
    ModifyConsumerGroupDescriptionRequest: ModifyConsumerGroupDescriptionRequest,
    ContinueSyncJobRequest: ContinueSyncJobRequest,
    ModifySubscribeObjectsResponse: ModifySubscribeObjectsResponse,
    CreateMigrationServiceResponse: CreateMigrationServiceResponse,
    KafkaOption: KafkaOption,
    DescribeMigrationCheckJobResponse: DescribeMigrationCheckJobResponse,
    StopSyncJobRequest: StopSyncJobRequest,
    DifferenceDetail: DifferenceDetail,
    DBInfo: DBInfo,
    TopicRule: TopicRule,
    DestroySyncJobRequest: DestroySyncJobRequest,
    ViewItem: ViewItem,
    CreateCheckSyncJobResponse: CreateCheckSyncJobResponse,
    CreateSubscribeCheckJobResponse: CreateSubscribeCheckJobResponse,
    ModifyConsumerGroupDescriptionResponse: ModifyConsumerGroupDescriptionResponse,
    CompareObjectItem: CompareObjectItem,
    ConfigureSyncJobRequest: ConfigureSyncJobRequest,
    StartModifySyncJobResponse: StartModifySyncJobResponse,
    SubscribeCheckStepInfo: SubscribeCheckStepInfo,
    MigrateDBItem: MigrateDBItem,
    DescribeMigrateDBInstancesRequest: DescribeMigrateDBInstancesRequest,
    CheckStepInfo: CheckStepInfo,
    ProcessStepTip: ProcessStepTip,
    ModifyCompareTaskRequest: ModifyCompareTaskRequest,
    RecoverSyncJobRequest: RecoverSyncJobRequest,
    Database: Database,
    Column: Column,
    JobItem: JobItem,
    DestroyIsolatedSubscribeResponse: DestroyIsolatedSubscribeResponse,
    ModifiedSubscribeObject: ModifiedSubscribeObject,
    DescribeCompareTasksResponse: DescribeCompareTasksResponse,
    ResumeSubscribeResponse: ResumeSubscribeResponse,
    DescribeSyncJobsRequest: DescribeSyncJobsRequest,
    SyncDetailInfo: SyncDetailInfo,
    DescribeConsumerGroupsResponse: DescribeConsumerGroupsResponse,
    ModifyMigrateRateLimitRequest: ModifyMigrateRateLimitRequest,
    CompareTableItem: CompareTableItem,
    ConfigureSyncJobResponse: ConfigureSyncJobResponse,
    CompareViewItem: CompareViewItem,
    StepInfo: StepInfo,
    SubscribeObject: SubscribeObject,
    ResumeMigrateJobRequest: ResumeMigrateJobRequest,
    PauseSyncJobResponse: PauseSyncJobResponse,
    DescribeSubscribeCheckJobRequest: DescribeSubscribeCheckJobRequest,
    ModifySubscribeObjectsRequest: ModifySubscribeObjectsRequest,
    View: View,
    MonitorInfo: MonitorInfo,
    DescribeOffsetByTimeRequest: DescribeOffsetByTimeRequest,
    StartCompareResponse: StartCompareResponse,
    DynamicOptions: DynamicOptions,
    CreateCompareTaskResponse: CreateCompareTaskResponse,
    RateLimitOption: RateLimitOption,
    SkipCheckItemRequest: SkipCheckItemRequest,
    CompareAbstractInfo: CompareAbstractInfo,
    CheckStep: CheckStep,
    CompareTaskItem: CompareTaskItem,
    ModifyMigrateJobSpecResponse: ModifyMigrateJobSpecResponse,
    CreateSyncJobResponse: CreateSyncJobResponse,
    CreateCompareTaskRequest: CreateCompareTaskRequest,
    ErrInfo: ErrInfo,
    StartCompareRequest: StartCompareRequest,
    EndpointItem: EndpointItem,
    DescribeMigrationCheckJobRequest: DescribeMigrationCheckJobRequest,
    DescribeMigrationDetailResponse: DescribeMigrationDetailResponse,
    CreateModifyCheckSyncJobResponse: CreateModifyCheckSyncJobResponse,
    ModifyMigrateNameRequest: ModifyMigrateNameRequest,
    CreateSubscribeRequest: CreateSubscribeRequest,
    StartSyncJobResponse: StartSyncJobResponse,
    StartMigrateJobRequest: StartMigrateJobRequest,
    DistributeRule: DistributeRule,
    Objects: Objects,
    DeleteConsumerGroupResponse: DeleteConsumerGroupResponse,
    DBItem: DBItem,
    DeleteCompareTaskRequest: DeleteCompareTaskRequest,
    MigrateDetailInfo: MigrateDetailInfo,
    StopMigrateJobRequest: StopMigrateJobRequest,
    Endpoint: Endpoint,
    ConfigureSubscribeJobRequest: ConfigureSubscribeJobRequest,
    SyncJobInfo: SyncJobInfo,
    DescribeSubscribeCheckJobResponse: DescribeSubscribeCheckJobResponse,
    RoleItem: RoleItem,
    TagFilter: TagFilter,
    StepDetailInfo: StepDetailInfo,
    CreateSyncJobRequest: CreateSyncJobRequest,
    SubscribeKafkaConfig: SubscribeKafkaConfig,
    DescribeCompareReportRequest: DescribeCompareReportRequest,
    SkippedItem: SkippedItem,
    IsolateSubscribeRequest: IsolateSubscribeRequest,
    DescribeSubscribeReturnableResponse: DescribeSubscribeReturnableResponse,
    TagItem: TagItem,
    RecoverMigrateJobRequest: RecoverMigrateJobRequest,
    OnlineDDL: OnlineDDL,
    DescribeSubscribeJobsResponse: DescribeSubscribeJobsResponse,
    ResetSubscribeRequest: ResetSubscribeRequest,
    DatabaseTableObject: DatabaseTableObject,
    ModifyMigrateRuntimeAttributeRequest: ModifyMigrateRuntimeAttributeRequest,
    PauseMigrateJobResponse: PauseMigrateJobResponse,
    Table: Table,
    SubscribeCheckStepTip: SubscribeCheckStepTip,
    CompareDetailInfo: CompareDetailInfo,
    DescribeSubscribeJobsRequest: DescribeSubscribeJobsRequest,
    StartMigrateJobResponse: StartMigrateJobResponse,
    ConsistencyOption: ConsistencyOption,

}
